diff -r d8c2ce63f5a4 -r 297b3529876a .hgignore --- a/.hgignore Fri Jan 25 23:53:29 2013 +0200 +++ b/.hgignore Fri Jan 25 22:52:26 2013 +0100 @@ -1,7 +1,6 @@ .gdb_history .purify .svn/ -DS_Store Makefile$ Makefile.pre$ TAGS$ diff -r d8c2ce63f5a4 -r 297b3529876a .hgtouch --- a/.hgtouch Fri Jan 25 23:53:29 2013 +0200 +++ b/.hgtouch Fri Jan 25 22:52:26 2013 +0100 @@ -2,11 +2,11 @@ # Define dependencies of generated files that are checked into hg. # The syntax of this file uses make rule dependencies, without actions -Python/importlib.h: Lib/importlib/_bootstrap.py Modules/_freeze_importlib.c +Python/importlib.h: Lib/importlib/_bootstrap.py Python/freeze_importlib.py Include/ast.h: Parser/Python.asdl Parser/asdl.py Parser/asdl_c.py Python/Python-ast.c: Include/ast.h Python/opcode_targets.h: Python/makeopcodetargets.py Lib/opcode.py -Objects/typeslots.inc: Include/typeslots.h Objects/typeslots.py +Objects/typeslots.inc: Include/typeslots.h Objects/typeslots.py \ No newline at end of file diff -r d8c2ce63f5a4 -r 297b3529876a Doc/howto/cporting.rst --- a/Doc/howto/cporting.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/howto/cporting.rst Fri Jan 25 22:52:26 2013 +0100 @@ -100,6 +100,25 @@ used in Python 2 was removed. In the C-API, ``PyInt_*`` functions are replaced by their ``PyLong_*`` equivalents. +The best course of action here is using the ``PyInt_*`` functions aliased to +``PyLong_*`` found in :file:`intobject.h`. The abstract ``PyNumber_*`` APIs +can also be used in some cases. :: + + #include "Python.h" + #include "intobject.h" + + static PyObject * + add_ints(PyObject *self, PyObject *args) { + int one, two; + PyObject *result; + + if (!PyArg_ParseTuple(args, "ii:add_ints", &one, &two)) + return NULL; + + return PyInt_FromLong(one + two); + } + + Module initialization and state =============================== diff -r d8c2ce63f5a4 -r 297b3529876a Doc/howto/functional.rst --- a/Doc/howto/functional.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/howto/functional.rst Fri Jan 25 22:52:26 2013 +0100 @@ -479,10 +479,13 @@ You could equally write ``for i in generate_ints(5)``, or ``a,b,c = generate_ints(3)``. -Inside a generator function, ``return value`` is semantically equivalent to -``raise StopIteration(value)``. If no value is returned or the bottom of the -function is reached, the procession of values ends and the generator cannot -return any further values. +Inside a generator function, the ``return`` statement can only be used without a +value, and signals the end of the procession of values; after executing a +``return`` the generator cannot return any further values. ``return`` with a +value, such as ``return 5``, is a syntax error inside a generator function. The +end of the generator's results can also be indicated by raising +:exc:`StopIteration` manually, or by just letting the flow of execution fall off +the bottom of the function. You could achieve the effect of generators manually by writing your own class and storing all the local variables of the generator as instance variables. For diff -r d8c2ce63f5a4 -r 297b3529876a Doc/howto/logging-cookbook.rst --- a/Doc/howto/logging-cookbook.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/howto/logging-cookbook.rst Fri Jan 25 22:52:26 2013 +0100 @@ -1613,85 +1613,3 @@ RFC 5424-compliant messages. If you don't, logging may not complain, but your messages will not be RFC 5424-compliant, and your syslog daemon may complain. - -Implementing structured logging -------------------------------- - -Although most logging messages are intended for reading by humans, and thus not -readily machine-parseable, there might be cirumstances where you want to output -messages in a structured format which *is* capable of being parsed by a program -(without needing complex regular expressions to parse the log message). This is -straightforward to achieve using the logging package. There are a number of -ways in which this could be achieved, but the following is a simple approach -which uses JSON to serialise the event in a machine-parseable manner:: - - import json - import logging - - class StructuredMessage(object): - def __init__(self, message, **kwargs): - self.message = message - self.kwargs = kwargs - - def __str__(self): - return '%s >>> %s' % (self.message, json.dumps(self.kwargs)) - - _ = StructuredMessage # optional, to improve readability - - logging.basicConfig(level=logging.INFO, format='%(message)s') - logging.info(_('message 1', foo='bar', bar='baz', num=123, fnum=123.456)) - -If the above script is run, it prints:: - - message 1 >>> {"fnum": 123.456, "num": 123, "bar": "baz", "foo": "bar"} - -Note that the order of items might be different according to the version of -Python used. - -If you need more specialised processing, you can use a custom JSON encoder, -as in the following complete example:: - - from __future__ import unicode_literals - - import json - import logging - - # This next bit is to ensure the script runs unchanged on 2.x and 3.x - try: - unicode - except NameError: - unicode = str - - class Encoder(json.JSONEncoder): - def default(self, o): - if isinstance(o, set): - return tuple(o) - elif isinstance(o, unicode): - return o.encode('unicode_escape').decode('ascii') - return super(Encoder, self).default(o) - - class StructuredMessage(object): - def __init__(self, message, **kwargs): - self.message = message - self.kwargs = kwargs - - def __str__(self): - s = Encoder().encode(self.kwargs) - return '%s >>> %s' % (self.message, s) - - _ = StructuredMessage # optional, to improve readability - - def main(): - logging.basicConfig(level=logging.INFO, format='%(message)s') - logging.info(_('message 1', set_value=set([1, 2, 3]), snowman='\u2603')) - - if __name__ == '__main__': - main() - -When the above script is run, it prints:: - - message 1 >>> {"snowman": "\u2603", "set_value": [1, 2, 3]} - -Note that the order of items might be different according to the version of -Python used. - diff -r d8c2ce63f5a4 -r 297b3529876a Doc/howto/logging.rst --- a/Doc/howto/logging.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/howto/logging.rst Fri Jan 25 22:52:26 2013 +0100 @@ -330,9 +330,6 @@ to output. * Formatters specify the layout of log records in the final output. -Log event information is passed between loggers, handlers, filters and -formatters in a :class:`LogRecord` instance. - Logging is performed by calling methods on instances of the :class:`Logger` class (hereafter called :dfn:`loggers`). Each instance has a name, and they are conceptually arranged in a namespace hierarchy using dots (periods) as @@ -377,13 +374,6 @@ *format* keyword argument. For all options regarding how a format string is constructed, see :ref:`formatter-objects`. -Logging Flow -^^^^^^^^^^^^ - -The flow of log event information in loggers and handlers is illustrated in the -following diagram. - -.. image:: logging_flow.png Loggers ^^^^^^^ diff -r d8c2ce63f5a4 -r 297b3529876a Doc/howto/logging_flow.png Binary file Doc/howto/logging_flow.png has changed diff -r d8c2ce63f5a4 -r 297b3529876a Doc/howto/unicode.rst --- a/Doc/howto/unicode.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/howto/unicode.rst Fri Jan 25 22:52:26 2013 +0100 @@ -44,7 +44,7 @@ machines had different codes, however, which led to problems exchanging files. Eventually various commonly used sets of values for the 128--255 range emerged. Some were true standards, defined by the International Standards Organization, -and some were *de facto* conventions that were invented by one company or +and some were **de facto** conventions that were invented by one company or another and managed to catch on. 255 characters aren't very many. For example, you can't fit both the accented @@ -62,8 +62,8 @@ to represent many different characters from many different alphabets; an initial goal was to have Unicode contain the alphabets for every single human language. It turns out that even 16 bits isn't enough to meet that goal, and the modern -Unicode specification uses a wider range of codes, 0 through 1,114,111 ( -``0x10FFFF`` in base 16). +Unicode specification uses a wider range of codes, 0 through 1,114,111 (0x10ffff +in base 16). There's a related ISO standard, ISO 10646. Unicode and ISO 10646 were originally separate efforts, but the specifications were merged with the 1.1 @@ -87,11 +87,9 @@ The Unicode standard describes how characters are represented by **code points**. A code point is an integer value, usually denoted in base 16. In the -standard, a code point is written using the notation ``U+12CA`` to mean the -character with value ``0x12ca`` (4,810 decimal). The Unicode standard contains -a lot of tables listing characters and their corresponding code points: - -.. code-block:: none +standard, a code point is written using the notation U+12ca to mean the +character with value 0x12ca (4,810 decimal). The Unicode standard contains a lot +of tables listing characters and their corresponding code points:: 0061 'a'; LATIN SMALL LETTER A 0062 'b'; LATIN SMALL LETTER B @@ -100,7 +98,7 @@ 007B '{'; LEFT CURLY BRACKET Strictly, these definitions imply that it's meaningless to say 'this is -character ``U+12CA``'. ``U+12CA`` is a code point, which represents some particular +character U+12ca'. U+12ca is a code point, which represents some particular character; in this case, it represents the character 'ETHIOPIC SYLLABLE WI'. In informal contexts, this distinction between code points and characters will sometimes be forgotten. @@ -117,15 +115,13 @@ --------- To summarize the previous section: a Unicode string is a sequence of code -points, which are numbers from 0 through ``0x10FFFF`` (1,114,111 decimal). This +points, which are numbers from 0 through 0x10ffff (1,114,111 decimal). This sequence needs to be represented as a set of bytes (meaning, values from 0 through 255) in memory. The rules for translating a Unicode string into a sequence of bytes are called an **encoding**. The first encoding you might think of is an array of 32-bit integers. In this -representation, the string "Python" would look like this: - -.. code-block:: none +representation, the string "Python" would look like this:: P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 @@ -137,10 +133,10 @@ 1. It's not portable; different processors order the bytes differently. 2. It's very wasteful of space. In most texts, the majority of the code points - are less than 127, or less than 255, so a lot of space is occupied by ``0x00`` + are less than 127, or less than 255, so a lot of space is occupied by zero bytes. The above string takes 24 bytes compared to the 6 bytes needed for an ASCII representation. Increased RAM usage doesn't matter too much (desktop - computers have gigabytes of RAM, and strings aren't usually that large), but + computers have megabytes of RAM, and strings aren't usually that large), but expanding our usage of disk and network bandwidth by a factor of 4 is intolerable. @@ -179,12 +175,14 @@ UTF-8 is one of the most commonly used encodings. UTF stands for "Unicode Transformation Format", and the '8' means that 8-bit numbers are used in the -encoding. (There are also a UTF-16 and UTF-32 encodings, but they are less -frequently used than UTF-8.) UTF-8 uses the following rules: +encoding. (There's also a UTF-16 encoding, but it's less frequently used than +UTF-8.) UTF-8 uses the following rules: -1. If the code point is < 128, it's represented by the corresponding byte value. -2. If the code point is >= 128, it's turned into a sequence of two, three, or - four bytes, where each byte of the sequence is between 128 and 255. +1. If the code point is <128, it's represented by the corresponding byte value. +2. If the code point is between 128 and 0x7ff, it's turned into two byte values + between 128 and 255. +3. Code points >0x7ff are turned into three- or four-byte sequences, where each + byte of the sequence is between 128 and 255. UTF-8 has several convenient properties: @@ -194,8 +192,8 @@ processed by C functions such as ``strcpy()`` and sent through protocols that can't handle zero bytes. 3. A string of ASCII text is also valid UTF-8 text. -4. UTF-8 is fairly compact; the majority of commonly used characters can be - represented with one or two bytes. +4. UTF-8 is fairly compact; the majority of code points are turned into two + bytes, and values less than 128 occupy only a single byte. 5. If bytes are corrupted or lost, it's possible to determine the start of the next UTF-8-encoded code point and resynchronize. It's also unlikely that random 8-bit data will look like valid UTF-8. @@ -205,25 +203,25 @@ References ---------- -The `Unicode Consortium site `_ has character charts, a +The Unicode Consortium site at has character charts, a glossary, and PDF versions of the Unicode specification. Be prepared for some -difficult reading. `A chronology `_ of the -origin and development of Unicode is also available on the site. +difficult reading. is a chronology of the +origin and development of Unicode. -To help understand the standard, Jukka Korpela has written `an introductory -guide `_ to reading the -Unicode character tables. +To help understand the standard, Jukka Korpela has written an introductory guide +to reading the Unicode character tables, available at +. -Another `good introductory article `_ -was written by Joel Spolsky. +Another good introductory article was written by Joel Spolsky +. If this introduction didn't make things clear to you, you should try reading this alternate article before continuing. .. Jason Orendorff XXX http://www.jorendorff.com/articles/unicode/ is broken -Wikipedia entries are often helpful; see the entries for "`character encoding -`_" and `UTF-8 -`_, for example. +Wikipedia entries are often helpful; see the entries for "character encoding" + and UTF-8 +, for example. Python's Unicode Support @@ -235,11 +233,11 @@ The String Type --------------- -Since Python 3.0, the language features a :class:`str` type that contain Unicode +Since Python 3.0, the language features a ``str`` type that contain Unicode characters, meaning any string created using ``"unicode rocks!"``, ``'unicode rocks!'``, or the triple-quoted string syntax is stored as Unicode. -To insert a non-ASCII Unicode character, e.g., any letters with +To insert a Unicode character that is not part ASCII, e.g., any letters with accents, one can use escape sequences in their string literals as such:: >>> "\N{GREEK CAPITAL LETTER DELTA}" # Using the character name @@ -249,16 +247,15 @@ >>> "\U00000394" # Using a 32-bit hex value '\u0394' -In addition, one can create a string using the :func:`~bytes.decode` method of -:class:`bytes`. This method takes an *encoding* argument, such as ``UTF-8``, -and optionally, an *errors* argument. +In addition, one can create a string using the :func:`decode` method of +:class:`bytes`. This method takes an encoding, such as UTF-8, and, optionally, +an *errors* argument. The *errors* argument specifies the response when the input string can't be converted according to the encoding's rules. Legal values for this argument are -``'strict'`` (raise a :exc:`UnicodeDecodeError` exception), ``'replace'`` (use -``U+FFFD``, ``REPLACEMENT CHARACTER``), or ``'ignore'`` (just leave the -character out of the Unicode result). -The following examples show the differences:: +'strict' (raise a :exc:`UnicodeDecodeError` exception), 'replace' (use U+FFFD, +'REPLACEMENT CHARACTER'), or 'ignore' (just leave the character out of the +Unicode result). The following examples show the differences:: >>> b'\x80abc'.decode("utf-8", "strict") #doctest: +NORMALIZE_WHITESPACE Traceback (most recent call last): @@ -276,8 +273,8 @@ Encodings are specified as strings containing the encoding's name. Python 3.2 comes with roughly 100 different encodings; see the Python Library Reference at :ref:`standard-encodings` for a list. Some encodings have multiple names; for -example, ``'latin-1'``, ``'iso_8859_1'`` and ``'8859``' are all synonyms for -the same encoding. +example, 'latin-1', 'iso_8859_1' and '8859' are all synonyms for the same +encoding. One-character Unicode strings can also be created with the :func:`chr` built-in function, which takes integers and returns a Unicode string of length 1 @@ -293,14 +290,13 @@ Converting to Bytes ------------------- -The opposite method of :meth:`bytes.decode` is :meth:`str.encode`, -which returns a :class:`bytes` representation of the Unicode string, encoded in the -requested *encoding*. The *errors* parameter is the same as the parameter of -the :meth:`~bytes.decode` method, with one additional possibility; as well as -``'strict'``, ``'ignore'``, and ``'replace'`` (which in this case inserts a -question mark instead of the unencodable character), you can also pass -``'xmlcharrefreplace'`` which uses XML's character references. -The following example shows the different results:: +Another important str method is ``.encode([encoding], [errors='strict'])``, +which returns a ``bytes`` representation of the Unicode string, encoded in the +requested encoding. The ``errors`` parameter is the same as the parameter of +the :meth:`decode` method, with one additional possibility; as well as 'strict', +'ignore', and 'replace' (which in this case inserts a question mark instead of +the unencodable character), you can also pass 'xmlcharrefreplace' which uses +XML's character references. The following example shows the different results:: >>> u = chr(40960) + 'abcd' + chr(1972) >>> u.encode('utf-8') @@ -317,8 +313,6 @@ >>> u.encode('ascii', 'xmlcharrefreplace') b'ꀀabcd޴' -.. XXX mention the surrogate* error handlers - The low-level routines for registering and accessing the available encodings are found in the :mod:`codecs` module. However, the encoding and decoding functions returned by this module are usually more low-level than is comfortable, so I'm @@ -371,14 +365,14 @@ ``coding: name`` or ``coding=name`` in the comment. If you don't include such a comment, the default encoding used will be UTF-8 as -already mentioned. See also :pep:`263` for more information. +already mentioned. Unicode Properties ------------------ The Unicode specification includes a database of information about code points. -For each defined code point, the information includes the character's +For each code point that's defined, the information includes the character's name, its category, the numeric value if applicable (Unicode has characters representing the Roman numerals and fractions such as one-third and four-fifths). There are also properties related to the code point's use in @@ -398,9 +392,7 @@ # Get numeric value of second character print(unicodedata.numeric(u[1])) -When run, this prints: - -.. code-block:: none +When run, this prints:: 0 00e9 Ll LATIN SMALL LETTER E WITH ACUTE 1 0bf2 No TAMIL NUMBER ONE THOUSAND @@ -421,7 +413,7 @@ References ---------- -The :class:`str` type is described in the Python library reference at +The ``str`` type is described in the Python library reference at :ref:`textseq`. The documentation for the :mod:`unicodedata` module. @@ -451,16 +443,16 @@ 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 -with ``bytes.decode(encoding)``. However, the manual approach is not recommended. +yourself: open a file, read an 8-bit byte string from it, and convert the string +with ``str(bytes, encoding)``. However, the manual approach is not recommended. One problem is the multi-byte nature of encodings; one Unicode character can be represented by several bytes. If you want to read the file in arbitrary-sized -chunks (say, 1k or 4k), you need to write error-handling code to catch the case +chunks (say, 1K or 4K), you need to write error-handling code to catch the case where only part of the bytes encoding a single Unicode character are read at the end of a chunk. One solution would be to read the entire file into memory and then perform the decoding, but that prevents you from working with files that -are extremely large; if you need to read a 2GB file, you need 2GB of RAM. +are extremely large; if you need to read a 2Gb file, you need 2Gb of RAM. (More, really, since for at least a moment you'd need to have both the encoded string and its Unicode version in memory.) @@ -468,9 +460,9 @@ 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 +parameters for methods such as ``.read()`` and ``.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`. +like those in string objects' :meth:`encode` and :meth:`decode` methods. Reading Unicode from a file is therefore simple:: @@ -486,7 +478,7 @@ f.seek(0) print(repr(f.readline()[:1])) -The Unicode character ``U+FEFF`` is used as a byte-order mark (BOM), and is often +The Unicode character U+FEFF is used as a byte-order mark (BOM), and is often written as the first character of a file in order to assist with autodetection of the file's byte ordering. Some encodings, such as UTF-16, expect a BOM to be present at the start of a file; when such an encoding is used, the BOM will be @@ -528,12 +520,12 @@ filenames. Function :func:`os.listdir`, which returns filenames, raises an issue: should it return -the Unicode version of filenames, or should it return bytes containing +the Unicode version of filenames, or should it return byte strings containing the encoded versions? :func:`os.listdir` will do both, depending on whether you -provided the directory path as bytes or a Unicode string. If you pass a +provided the directory path as a byte string or a Unicode string. If you pass a Unicode string as the path, filenames will be decoded using the filesystem's encoding and a list of Unicode strings will be returned, while passing a byte -path will return the bytes versions of the filenames. For example, +path will return the byte string versions of the filenames. For example, assuming the default filesystem encoding is UTF-8, running the following program:: @@ -567,13 +559,13 @@ The most important tip is: - Software should only work with Unicode strings internally, decoding the input - data as soon as possible and encoding the output only at the end. + Software should only work with Unicode strings internally, converting to a + particular encoding on output. If you attempt to write processing functions that accept both Unicode and byte strings, you will find your program vulnerable to bugs wherever you combine the -two different kinds of strings. There is no automatic encoding or decoding: if -you do e.g. ``str + bytes``, a :exc:`TypeError` will be raised. +two different kinds of strings. There is no automatic encoding or decoding if +you do e.g. ``str + bytes``, a :exc:`TypeError` is raised for this expression. When using data coming from a web browser or some other untrusted source, a common technique is to check for illegal characters in a string before using the @@ -618,6 +610,7 @@ and that the HOWTO only covers 2.x. .. comment Describe Python 3.x support (new section? new document?) +.. comment Additional topic: building Python w/ UCS2 or UCS4 support .. comment Describe use of codecs.StreamRecoder and StreamReaderWriter .. comment @@ -647,3 +640,5 @@ - [ ] Writing Unicode programs - [ ] Do everything in Unicode - [ ] Declaring source code encodings (PEP 263) + - [ ] Other issues + - [ ] Building Python (UCS2, UCS4) diff -r d8c2ce63f5a4 -r 297b3529876a Doc/library/asyncore.rst --- a/Doc/library/asyncore.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/library/asyncore.rst Fri Jan 25 22:52:26 2013 +0100 @@ -184,15 +184,20 @@ Most of these are nearly identical to their socket partners. - .. method:: create_socket(family=socket.AF_INET, type=socket.SOCK_STREAM) + .. method:: create_socket(family=socket.AF_INET, type=socket.SOCK_STREAM, cloexec=None) This is identical to the creation of a normal socket, and will use the same options for creation. Refer to the :mod:`socket` documentation for information on creating sockets. + If *cloexec* is ``True``, set the :ref:`close-on-exec flag `. + .. versionchanged:: 3.3 *family* and *type* arguments can be omitted. + .. versionchanged:: 3.4 + *cloexec* parameter was added. + .. method:: connect(address) diff -r d8c2ce63f5a4 -r 297b3529876a Doc/library/functions.rst --- a/Doc/library/functions.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/library/functions.rst Fri Jan 25 22:52:26 2013 +0100 @@ -823,7 +823,7 @@ .. index:: single: file object; open() built-in function -.. function:: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) +.. function:: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None, cloexec=None) Open *file* and return a corresponding :term:`file object`. If the file cannot be opened, an :exc:`OSError` is raised. @@ -942,6 +942,8 @@ :mod:`os.open` as *opener* results in functionality similar to passing ``None``). + If *cloexec* is ``True``, set the :ref:`close-on-exec flag `. + The following example uses the :ref:`dir_fd ` parameter of the :func:`os.open` function to open a file relative to a given directory:: @@ -959,6 +961,9 @@ The *opener* parameter was added. The ``'x'`` mode was added. + .. versionchanged:: 3.4 + The *cloexec* parameter was added. + The type of :term:`file object` returned by the :func:`open` function depends on the mode. When :func:`open` is used to open a file in a text mode (``'w'``, ``'r'``, ``'wt'``, ``'rt'``, etc.), it returns a subclass of diff -r d8c2ce63f5a4 -r 297b3529876a Doc/library/io.rst --- a/Doc/library/io.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/library/io.rst Fri Jan 25 22:52:26 2013 +0100 @@ -110,7 +110,7 @@ :func:`os.stat`) if possible. -.. function:: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True) +.. function:: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, cloexec=None) This is an alias for the builtin :func:`open` function. @@ -487,7 +487,7 @@ Raw File I/O ^^^^^^^^^^^^ -.. class:: FileIO(name, mode='r', closefd=True, opener=None) +.. class:: FileIO(name, mode='r', closefd=True, opener=None, cloexec=None) :class:`FileIO` represents an OS-level file containing bytes data. It implements the :class:`RawIOBase` interface (and therefore the @@ -517,6 +517,8 @@ :mod:`os.open` as *opener* results in functionality similar to passing ``None``). + If *cloexec* is ``True``, set the :ref:`close-on-exec flag `. + See the :func:`open` built-in function for examples on using the *opener* parameter. @@ -524,6 +526,9 @@ The *opener* parameter was added. The ``'x'`` mode was added. + .. versionchanged:: 3.4 + The *cloexec* parameter was added. + In addition to the attributes and methods from :class:`IOBase` and :class:`RawIOBase`, :class:`FileIO` provides the following data attributes: diff -r d8c2ce63f5a4 -r 297b3529876a Doc/library/logging.rst --- a/Doc/library/logging.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/library/logging.rst Fri Jan 25 22:52:26 2013 +0100 @@ -70,25 +70,16 @@ .. attribute:: Logger.propagate - If this evaluates to true, events logged to this logger will be passed to the - handlers of higher level (ancestor) loggers, in addition to any handlers - attached to this logger. Messages are passed directly to the ancestor - loggers' handlers - neither the level nor filters of the ancestor loggers in - question are considered. + If this evaluates to true, logging messages are passed by this logger and by + its child loggers to the handlers of higher level (ancestor) loggers. + Messages are passed directly to the ancestor loggers' handlers - neither the + level nor filters of the ancestor loggers in question are considered. If this evaluates to false, logging messages are not passed to the handlers of ancestor loggers. The constructor sets this attribute to ``True``. - .. note:: If you attach a handler to a logger *and* one or more of its - ancestors, it may emit the same record multiple times. In general, you - should not need to attach a handler to more than one logger - if you just - attach it to the appropriate logger which is highest in the logger - hierarchy, then it will see all events logged by all descendant loggers, - provided that their propagate setting is left set to ``True``. A common - scenario is to attach handlers only to the root logger, and to let - propagation take care of the rest. .. method:: Logger.setLevel(lvl) @@ -264,10 +255,7 @@ .. method:: Logger.filter(record) Applies this logger's filters to the record and returns a true value if the - record is to be processed. The filters are consulted in turn, until one of - them returns a false value. If none of them return a false value, the record - will be processed (passed to handlers). If one returns a false value, no - further processing of the record occurs. + record is to be processed. .. method:: Logger.addHandler(hdlr) @@ -376,10 +364,7 @@ .. method:: Handler.filter(record) Applies this handler's filters to the record and returns a true value if the - record is to be processed. The filters are consulted in turn, until one of - them returns a false value. If none of them return a false value, the record - will be emitted. If one returns a false value, the handler will not emit the - record. + record is to be processed. .. method:: Handler.flush() @@ -562,12 +547,12 @@ yes. If deemed appropriate, the record may be modified in-place by this method. -Note that filters attached to handlers are consulted before an event is +Note that filters attached to handlers are consulted whenever an event is emitted by the handler, whereas filters attached to loggers are consulted -whenever an event is logged (using :meth:`debug`, :meth:`info`, -etc.), before sending an event to handlers. This means that events which have -been generated by descendant loggers will not be filtered by a logger's filter -setting, unless the filter has also been applied to those descendant loggers. +whenever an event is logged to the handler (using :meth:`debug`, :meth:`info`, +etc.) This means that events which have been generated by descendant loggers +will not be filtered by a logger's filter setting, unless the filter has also +been applied to those descendant loggers. You don't actually need to subclass ``Filter``: you can pass any instance which has a ``filter`` method with the same semantics. @@ -611,9 +596,7 @@ record. :param name: The name of the logger used to log the event represented by - this LogRecord. Note that this name will always have this - value, even though it may be emitted by a handler attached to - a different (ancestor) logger. + this LogRecord. :param level: The numeric level of the logging event (one of DEBUG, INFO etc.) Note that this is converted to *two* attributes of the LogRecord: ``levelno`` for the numeric value and ``levelname`` for the diff -r d8c2ce63f5a4 -r 297b3529876a Doc/library/math.rst --- a/Doc/library/math.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/library/math.rst Fri Jan 25 22:52:26 2013 +0100 @@ -4,9 +4,6 @@ .. module:: math :synopsis: Mathematical functions (sin() etc.). -.. testsetup:: - - from math import fsum This module is always available. It provides access to the mathematical functions defined by the C standard. @@ -80,6 +77,8 @@ .. function:: fsum(iterable) +.. testsetup:: + >>> from math import fsum Return an accurate floating point sum of values in the iterable. Avoids loss of precision by tracking multiple intermediate partial sums:: diff -r d8c2ce63f5a4 -r 297b3529876a Doc/library/os.rst --- a/Doc/library/os.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/library/os.rst Fri Jan 25 22:52:26 2013 +0100 @@ -683,19 +683,27 @@ if it is connected to a terminal; else return :const:`None`. -.. function:: dup(fd) - - Return a duplicate of file descriptor *fd*. +.. function:: dup(fd, cloexec=None) + + Return a duplicate of file descriptor *fd*. If *cloexec* is ``True``, set + the :ref:`close-on-exec flag `. Availability: Unix, Windows. - -.. function:: dup2(fd, fd2) + .. versionchanged:: 3.4 + *cloexec* parameter was added. + + +.. function:: dup2(fd, fd2, cloexec=None) Duplicate file descriptor *fd* to *fd2*, closing the latter first if necessary. + If *cloexec* is ``True``, set the :ref:`close-on-exec flag ` on *fd2*. Availability: Unix, Windows. + .. versionchanged:: 3.4 + *cloexec* parameter was added. + .. function:: fchmod(fd, mode) @@ -843,7 +851,7 @@ :data:`os.SEEK_HOLE` or :data:`os.SEEK_DATA`. -.. function:: open(file, flags, mode=0o777, *, dir_fd=None) +.. function:: open(file, flags, mode=0o777, *, dir_fd=None, cloexec=None) Open the file *file* and set various flags according to *flags* and possibly its mode according to *mode*. When computing *mode*, the current umask value @@ -857,8 +865,13 @@ This function can support :ref:`paths relative to directory descriptors `. + If *cloexec* is ``True``, set the :ref:`close-on-exec flag `. + Availability: Unix, Windows. + .. versionchanged:: 3.4 + *cloexec* parameter was added. + .. note:: This function is intended for low-level I/O. For normal usage, use the @@ -870,24 +883,34 @@ The *dir_fd* argument. -.. function:: openpty() +.. function:: openpty(cloexec=None) .. index:: module: pty - Open a new pseudo-terminal pair. Return a pair of file descriptors ``(master, - slave)`` for the pty and the tty, respectively. For a (slightly) more portable - approach, use the :mod:`pty` module. + Open a new pseudo-terminal pair. If *cloexec* is ``True``, set + the :ref:`close-on-exec flag `. Return a pair of file descriptors + ``(master, slave)`` for the pty and the tty, respectively. For a (slightly) + more portable approach, use the :mod:`pty` module. Availability: some flavors of Unix. - -.. function:: pipe() - - Create a pipe. Return a pair of file descriptors ``(r, w)`` usable for reading + .. versionchanged:: 3.4 + *cloexec* parameter was added. + + +.. function:: pipe(cloexec=None) + + Create a pipe. If *cloexec* is ``True``, set the :ref:`close-on-exec flag + `. Return a pair of file descriptors ``(r, w)`` usable for reading and writing, respectively. + Setting close-on-exec flag is atomic on Windows and Linux 2.6.27 or newer. + Availability: Unix, Windows. + .. versionchanged:: 3.4 + *cloexec* parameter was added. + .. function:: pipe2(flags) @@ -1192,6 +1215,51 @@ Height of the terminal window in characters. +.. _cloexec: + +Close-on-exec flag +~~~~~~~~~~~~~~~~~~ + +A file descriptor has a close-on-exec flag which indicates if the file +descriptor will be inherited or not. + +On UNIX, the file descriptor will be closed on the execution of child processes +if the close-on-exec flag is set, the file descriptor is inherited by child +processes if the flag is cleared. + +On Windows, the file descriptor is not inherited if the close-on-exec flag is +set, the file descriptor is inherited by child processes if the flag is cleared +and if :c:func:`CreateProcess` is called with the *bInheritHandles* parameter +set to ``TRUE`` (when :class:`subprocess.Popen` is created with +``close_fds=False`` for example). + +Example of functions having the *cloexec* parameter: :func:`open`, +:func:`os.pipe`, :func:`socket.socket`. The default value of the *cloexec* +parameter is :func:`sys.getdefaultcloexec`, it is ``False`` at startup. It +can be set to ``True`` using :func:`sys.setdefaultcloexec`, by setting the +:envvar:`PYTHONCLOEXEC` environment variable, and using :option:`-e` command +line option. + + +.. function:: get_cloexec(fd) + + Get close-on-exe flag of the specified file descriptor. Return a :class:`bool`. + + Availability: Windows, Linux, FreeBSD, NetBSD, OpenBSD, Mac OS X, Solaris. + + .. versionadded:: 3.4 + +.. function:: set_cloexec(fd, cloexec=True) + + Set or clear close-on-exe flag on the specified file descriptor. + + Availability: Windows, Linux, FreeBSD, NetBSD, OpenBSD, Mac OS X, Solaris. + + .. versionadded:: 3.4 + + + + .. _os-file-dir: Files and Directories diff -r d8c2ce63f5a4 -r 297b3529876a Doc/library/shutil.rst --- a/Doc/library/shutil.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/library/shutil.rst Fri Jan 25 22:52:26 2013 +0100 @@ -348,7 +348,7 @@ directories. For example, on Windows:: >>> shutil.which("python") - 'C:\\Python33\\python.EXE' + 'c:\\python33\\python.exe' .. versionadded:: 3.3 diff -r d8c2ce63f5a4 -r 297b3529876a Doc/library/socket.rst --- a/Doc/library/socket.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/library/socket.rst Fri Jan 25 22:52:26 2013 +0100 @@ -445,7 +445,7 @@ ``'udp'``, otherwise any protocol will match. -.. function:: socket([family[, type[, proto]]]) +.. function:: socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None, cloexec=None) Create a new socket using the given address family, socket type and protocol number. The address family should be :const:`AF_INET` (the default), @@ -455,25 +455,36 @@ constants. The protocol number is usually zero and may be omitted in that case or :const:`CAN_RAW` in case the address family is :const:`AF_CAN`. + If *cloexec* is ``True``, set the :ref:`close-on-exec flag `. + .. versionchanged:: 3.3 The AF_CAN family was added. The AF_RDS family was added. + .. versionchanged:: 3.4 + *cloexec* parameter was added. -.. function:: socketpair([family[, type[, proto]]]) + +.. function:: socketpair(family=AF_INET, type=SOCK_STREAM, proto=0, cloexec=None) Build a pair of connected socket objects using the given address family, socket type, and protocol number. Address family, socket type, and protocol number are as for the :func:`socket` function above. The default family is :const:`AF_UNIX` if defined on the platform; otherwise, the default is :const:`AF_INET`. + + If *cloexec* is ``True``, set the :ref:`close-on-exec flag `. + Availability: Unix. .. versionchanged:: 3.2 The returned socket objects now support the whole socket API, rather than a subset. + .. versionchanged:: 3.4 + *cloexec* parameter was added. -.. function:: fromfd(fd, family, type[, proto]) + +.. function:: fromfd(fd, family, type, proto=0) Duplicate the file descriptor *fd* (an integer as returned by a file object's :meth:`fileno` method) and build a socket object from the result. Address @@ -705,13 +716,18 @@ correspond to Unix system calls applicable to sockets. -.. method:: socket.accept() +.. method:: socket.accept(cloexec=None) Accept a connection. The socket must be bound to an address and listening for connections. The return value is a pair ``(conn, address)`` where *conn* is a *new* socket object usable to send and receive data on the connection, and *address* is the address bound to the socket on the other end of the connection. + If *cloexec* is ``True``, set the :ref:`close-on-exec flag `. + + .. versionchanged:: 3.4 + *cloexec* parameter was added. + .. method:: socket.bind(address) diff -r d8c2ce63f5a4 -r 297b3529876a Doc/library/sys.rst --- a/Doc/library/sys.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/library/sys.rst Fri Jan 25 22:52:26 2013 +0100 @@ -401,6 +401,16 @@ Use :func:`getswitchinterval` instead. +.. function:: getdefaultcloexec() + + Return the default value of the *cloexec* parameter: + see :ref:`close-on-exec flag `. + + .. seealso:: :func:`sys.setdefaultcloexec`. + + .. versionadded:: 3.4 + + .. function:: getdefaultencoding() Return the name of the current default string encoding used by the Unicode @@ -903,6 +913,16 @@ :func:`setswitchinterval` instead. +.. function:: setdefaultcloexec() + + Set the default value of the *cloexec* parameter to ``True``: + see the :ref:`close-on-exec flag `. + + .. seealso:: :func:`sys.getdefaultcloexec`. + + .. versionadded:: 3.4 + + .. function:: setdlopenflags(n) Set the flags used by the interpreter for :c:func:`dlopen` calls, such as when diff -r d8c2ce63f5a4 -r 297b3529876a Doc/library/threading.rst --- a/Doc/library/threading.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/library/threading.rst Fri Jan 25 22:52:26 2013 +0100 @@ -308,10 +308,10 @@ .. impl-detail:: - In CPython, due to the :term:`Global Interpreter Lock`, only one thread + Due to the :term:`Global Interpreter Lock`, in CPython only one thread can execute Python code at once (even though certain performance-oriented libraries might overcome this limitation). - If you want your application to make better use of the computational + If you want your application to make better of use of the computational resources of multi-core machines, you are advised to use :mod:`multiprocessing` or :class:`concurrent.futures.ProcessPoolExecutor`. However, threading is still an appropriate model if you want to run diff -r d8c2ce63f5a4 -r 297b3529876a Doc/library/unittest.rst --- a/Doc/library/unittest.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/library/unittest.rst Fri Jan 25 22:52:26 2013 +0100 @@ -11,14 +11,17 @@ (If you are already familiar with the basic concepts of testing, you might want to skip to :ref:`the list of assert methods `.) -The :mod:`unittest` unit testing framework was originally inspired by JUnit -and has a similar flavor as major unit testing frameworks in other -languages. It supports test automation, sharing of setup and shutdown code -for tests, aggregation of tests into collections, and independence of the -tests from the reporting framework. - -To achieve this, :mod:`unittest` supports some important concepts in an -object-oriented way: +The Python unit testing framework, sometimes referred to as "PyUnit," is a +Python language version of JUnit, by Kent Beck and Erich Gamma. JUnit is, in +turn, a Java version of Kent's Smalltalk testing framework. Each is the de +facto standard unit testing framework for its respective language. + +:mod:`unittest` supports test automation, sharing of setup and shutdown code for +tests, aggregation of tests into collections, and independence of the tests from +the reporting framework. The :mod:`unittest` module provides classes that make +it easy to support these qualities for a set of tests. + +To achieve this, :mod:`unittest` supports some important concepts: test fixture A :dfn:`test fixture` represents the preparation needed to perform one or more @@ -27,7 +30,7 @@ process. test case - A :dfn:`test case` is the individual unit of testing. It checks for a specific + A :dfn:`test case` is the smallest unit of testing. It checks for a specific response to a particular set of inputs. :mod:`unittest` provides a base class, :class:`TestCase`, which may be used to create new test cases. @@ -41,12 +44,43 @@ a textual interface, or return a special value to indicate the results of executing the tests. +The test case and test fixture concepts are supported through the +:class:`TestCase` and :class:`FunctionTestCase` classes; the former should be +used when creating new tests, and the latter can be used when integrating +existing test code with a :mod:`unittest`\ -driven framework. When building test +fixtures using :class:`TestCase`, the :meth:`~TestCase.setUp` and +:meth:`~TestCase.tearDown` methods can be overridden to provide initialization +and cleanup for the fixture. With :class:`FunctionTestCase`, existing functions +can be passed to the constructor for these purposes. When the test is run, the +fixture initialization is run first; if it succeeds, the cleanup method is run +after the test has been executed, regardless of the outcome of the test. Each +instance of the :class:`TestCase` will only be used to run a single test method, +so a new fixture is created for each test. + +Test suites are implemented by the :class:`TestSuite` class. This class allows +individual tests and test suites to be aggregated; when the suite is executed, +all tests added directly to the suite and in "child" test suites are run. + +A test runner is an object that provides a single method, +:meth:`~TestRunner.run`, which accepts a :class:`TestCase` or :class:`TestSuite` +object as a parameter, and returns a result object. The class +:class:`TestResult` is provided for use as the result object. :mod:`unittest` +provides the :class:`TextTestRunner` as an example test runner which reports +test results on the standard error stream by default. Alternate runners can be +implemented for other environments (such as graphical environments) without any +need to derive from a specific class. + .. seealso:: Module :mod:`doctest` Another test-support module with a very different flavor. + `unittest2: A backport of new unittest features for Python 2.4-2.6 `_ + Many new features were added to unittest in Python 2.7, including test + discovery. unittest2 allows you to use these features with earlier + versions of Python. + `Simple Smalltalk Testing: With Patterns `_ Kent Beck's original paper on testing frameworks using the pattern shared by :mod:`unittest`. @@ -55,7 +89,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. @@ -139,8 +173,15 @@ OK -Passing the ``-v`` option to your test script will instruct :func:`unittest.main` -to enable a higher level of verbosity, and produce the following output:: +Instead of :func:`unittest.main`, there are other ways to run the tests with a +finer level of control, less terse output, and no requirement to be run from the +command line. For example, the last two lines may be replaced with:: + + suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions) + unittest.TextTestRunner(verbosity=2).run(suite) + +Running the revised script from the interpreter or another script produces the +following output:: test_choice (__main__.TestSequenceFunctions) ... ok test_sample (__main__.TestSequenceFunctions) ... ok @@ -318,30 +359,45 @@ To make your own test cases you must write subclasses of :class:`TestCase` or use :class:`FunctionTestCase`. +An instance of a :class:`TestCase`\ -derived class is an object that can +completely run a single test method, together with optional set-up and tidy-up +code. + The testing code of a :class:`TestCase` instance should be entirely self contained, such that it can be run either in isolation or in arbitrary combination with any number of other test cases. -The simplest :class:`TestCase` subclass will simply implement a test method -(i.e. a method whose name starts with ``test``) in order to perform specific -testing code:: +The simplest :class:`TestCase` subclass will simply override the +:meth:`~TestCase.runTest` method in order to perform specific testing code:: import unittest class DefaultWidgetSizeTestCase(unittest.TestCase): - def test_default_widget_size(self): + def runTest(self): widget = Widget('The widget') - self.assertEqual(widget.size(), (50, 50)) + self.assertEqual(widget.size(), (50, 50), 'incorrect default size') Note that in order to test something, we use one of the :meth:`assert\*` methods provided by the :class:`TestCase` base class. If the test fails, an exception will be raised, and :mod:`unittest` will identify the test case as a -:dfn:`failure`. Any other exceptions will be treated as :dfn:`errors`. - -Tests can be numerous, and their set-up can be repetitive. Luckily, we -can factor out set-up code by implementing a method called -:meth:`~TestCase.setUp`, which the testing framework will automatically -call for every single test we run:: +:dfn:`failure`. Any other exceptions will be treated as :dfn:`errors`. This +helps you identify where the problem is: :dfn:`failures` are caused by incorrect +results - a 5 where you expected a 6. :dfn:`Errors` are caused by incorrect +code - e.g., a :exc:`TypeError` caused by an incorrect function call. + +The way to run a test case will be described later. For now, note that to +construct an instance of such a test case, we call its constructor without +arguments:: + + testCase = DefaultWidgetSizeTestCase() + +Now, such test cases can be numerous, and their set-up can be repetitive. In +the above case, constructing a :class:`Widget` in each of 100 Widget test case +subclasses would mean unsightly duplication. + +Luckily, we can factor out such set-up code by implementing a method called +:meth:`~TestCase.setUp`, which the testing framework will automatically call for +us when we run the test:: import unittest @@ -349,26 +405,23 @@ def setUp(self): self.widget = Widget('The widget') - def test_default_widget_size(self): + class DefaultWidgetSizeTestCase(SimpleWidgetTestCase): + def runTest(self): self.assertEqual(self.widget.size(), (50,50), 'incorrect default size') - def test_widget_resize(self): + class WidgetResizeTestCase(SimpleWidgetTestCase): + def runTest(self): self.widget.resize(100,150) self.assertEqual(self.widget.size(), (100,150), 'wrong size after resize') -.. note:: - The order in which the various tests will be run is determined - by sorting the test method names with respect to the built-in - ordering for strings. - If the :meth:`~TestCase.setUp` method raises an exception while the test is -running, the framework will consider the test to have suffered an error, and -the test method will not be executed. +running, the framework will consider the test to have suffered an error, and the +:meth:`~TestCase.runTest` method will not be executed. Similarly, we can provide a :meth:`~TestCase.tearDown` method that tidies up -after the test method has been run:: +after the :meth:`~TestCase.runTest` method has been run:: import unittest @@ -378,20 +431,59 @@ def tearDown(self): self.widget.dispose() - -If :meth:`~TestCase.setUp` succeeded, :meth:`~TestCase.tearDown` will be -run whether the test method succeeded or not. + self.widget = None + +If :meth:`~TestCase.setUp` succeeded, the :meth:`~TestCase.tearDown` method will +be run whether :meth:`~TestCase.runTest` succeeded or not. Such a working environment for the testing code is called a :dfn:`fixture`. +Often, many small test cases will use the same fixture. In this case, we would +end up subclassing :class:`SimpleWidgetTestCase` into many small one-method +classes such as :class:`DefaultWidgetSizeTestCase`. This is time-consuming and +discouraging, so in the same vein as JUnit, :mod:`unittest` provides a simpler +mechanism:: + + import unittest + + class WidgetTestCase(unittest.TestCase): + def setUp(self): + self.widget = Widget('The widget') + + def tearDown(self): + self.widget.dispose() + self.widget = None + + def test_default_size(self): + self.assertEqual(self.widget.size(), (50,50), + 'incorrect default size') + + def test_resize(self): + self.widget.resize(100,150) + self.assertEqual(self.widget.size(), (100,150), + 'wrong size after resize') + +Here we have not provided a :meth:`~TestCase.runTest` method, but have instead +provided two different test methods. Class instances will now each run one of +the :meth:`test_\*` methods, with ``self.widget`` created and destroyed +separately for each instance. When creating an instance we must specify the +test method it is to run. We do this by passing the method name in the +constructor:: + + defaultSizeTestCase = WidgetTestCase('test_default_size') + resizeTestCase = WidgetTestCase('test_resize') + Test case instances are grouped together according to the features they test. :mod:`unittest` provides a mechanism for this: the :dfn:`test suite`, -represented by :mod:`unittest`'s :class:`TestSuite` class. In most cases, -calling :func:`unittest.main` will do the right thing and collect all the -module's test cases for you, and then execute them. - -However, should you want to customize the building of your test suite, -you can do it yourself:: +represented by :mod:`unittest`'s :class:`TestSuite` class:: + + widgetTestSuite = unittest.TestSuite() + widgetTestSuite.addTest(WidgetTestCase('test_default_size')) + widgetTestSuite.addTest(WidgetTestCase('test_resize')) + +For the ease of running tests, as we will see later, it is a good idea to +provide in each test module a callable object that returns a pre-built test +suite:: def suite(): suite = unittest.TestSuite() @@ -399,6 +491,37 @@ suite.addTest(WidgetTestCase('test_resize')) return suite +or even:: + + def suite(): + tests = ['test_default_size', 'test_resize'] + + return unittest.TestSuite(map(WidgetTestCase, tests)) + +Since it is a common pattern to create a :class:`TestCase` subclass with many +similarly named test functions, :mod:`unittest` provides a :class:`TestLoader` +class that can be used to automate the process of creating a test suite and +populating it with individual tests. For example, :: + + suite = unittest.TestLoader().loadTestsFromTestCase(WidgetTestCase) + +will create a test suite that will run ``WidgetTestCase.test_default_size()`` and +``WidgetTestCase.test_resize``. :class:`TestLoader` uses the ``'test'`` method +name prefix to identify test methods automatically. + +Note that the order in which the various test cases will be run is +determined by sorting the test function names with respect to the +built-in ordering for strings. + +Often it is desirable to group suites of test cases together, so as to run tests +for the whole system at once. This is easy, since :class:`TestSuite` instances +can be added to a :class:`TestSuite` just as :class:`TestCase` instances can be +added to a :class:`TestSuite`:: + + suite1 = module1.TheTestSuite() + suite2 = module2.TheTestSuite() + alltests = unittest.TestSuite([suite1, suite2]) + You can place the definitions of test cases and test suites in the same modules as the code they are to test (such as :file:`widget.py`), but there are several advantages to placing the test code in a separate module, such as @@ -441,13 +564,23 @@ assert something.name is not None # ... -one can create an equivalent test case instance as follows, with optional -set-up and tear-down methods:: +one can create an equivalent test case instance as follows:: + + testcase = unittest.FunctionTestCase(testSomething) + +If there are additional set-up and tear-down methods that should be called as +part of the test case's operation, they can also be provided like so:: testcase = unittest.FunctionTestCase(testSomething, setUp=makeSomethingDB, tearDown=deleteSomethingDB) +To make migrating existing test suites easier, :mod:`unittest` supports tests +raising :exc:`AssertionError` to indicate test failure. However, it is +recommended that you use the explicit :meth:`TestCase.fail\*` and +:meth:`TestCase.assert\*` methods instead, as future versions of :mod:`unittest` +may treat :exc:`AssertionError` differently. + .. note:: Even though :class:`FunctionTestCase` can be used to quickly convert an @@ -571,24 +704,32 @@ .. class:: TestCase(methodName='runTest') - Instances of the :class:`TestCase` class represent the logical test units + Instances of the :class:`TestCase` class represent the smallest testable units in the :mod:`unittest` universe. This class is intended to be used as a base class, with specific tests being implemented by concrete subclasses. This class implements the interface needed by the test runner to allow it to drive the - tests, and methods that the test code can use to check for and report various + test, and methods that the test code can use to check for and report various kinds of failure. - Each instance of :class:`TestCase` will run a single base method: the method - named *methodName*. However, the standard implementation of the default - *methodName*, ``runTest()``, will run every method starting with ``test`` - as an individual test, and count successes and failures accordingly. - Therefore, in most uses of :class:`TestCase`, you will neither change - the *methodName* nor reimplement the default ``runTest()`` method. + Each instance of :class:`TestCase` will run a single test method: the method + named *methodName*. If you remember, we had an earlier example that went + something like this:: + + def suite(): + suite = unittest.TestSuite() + suite.addTest(WidgetTestCase('test_default_size')) + suite.addTest(WidgetTestCase('test_resize')) + return suite + + Here, we create two instances of :class:`WidgetTestCase`, each of which runs a + single test. .. versionchanged:: 3.2 - :class:`TestCase` can be instantiated successfully without providing a - *methodName*. This makes it easier to experiment with :class:`TestCase` - from the interactive interpreter. + :class:`TestCase` can be instantiated successfully without providing a method + name. This makes it easier to experiment with :class:`TestCase` from the + interactive interpreter. + + *methodName* defaults to :meth:`runTest`. :class:`TestCase` instances provide three groups of methods: one group used to run the test, another used by the test implementation to check conditions @@ -597,6 +738,7 @@ Methods in the first group (running the test) are: + .. method:: setUp() Method called to prepare the test fixture. This is called immediately @@ -648,11 +790,10 @@ .. method:: run(result=None) - Run the test, collecting the result into the :class:`TestResult` object - passed as *result*. If *result* is omitted or ``None``, a temporary - result object is created (by calling the :meth:`defaultTestResult` - method) and used. The result object is returned to :meth:`run`'s - caller. + Run the test, collecting the result into the test result object passed as + *result*. If *result* is omitted or ``None``, a temporary result + object is created (by calling the :meth:`defaultTestResult` method) and + used. The result object is returned to :meth:`run`'s caller. The same effect may be had by simply calling the :class:`TestCase` instance. diff -r d8c2ce63f5a4 -r 297b3529876a Doc/library/xml.dom.minidom.rst --- a/Doc/library/xml.dom.minidom.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/library/xml.dom.minidom.rst Fri Jan 25 22:52:26 2013 +0100 @@ -1,8 +1,8 @@ -:mod:`xml.dom.minidom` --- Minimal DOM implementation -===================================================== +:mod:`xml.dom.minidom` --- Lightweight DOM implementation +========================================================= .. module:: xml.dom.minidom - :synopsis: Minimal Document Object Model (DOM) implementation. + :synopsis: Lightweight Document Object Model (DOM) implementation. .. moduleauthor:: Paul Prescod .. sectionauthor:: Paul Prescod .. sectionauthor:: Martin v. Löwis @@ -11,11 +11,17 @@ -------------- -:mod:`xml.dom.minidom` is a minimal implementation of the Document Object -Model interface, with an API similar to that in other languages. It is intended -to be simpler than the full DOM and also significantly smaller. Users who are -not already proficient with the DOM should consider using the -:mod:`xml.etree.ElementTree` module for their XML processing instead +:mod:`xml.dom.minidom` is a light-weight implementation of the Document Object +Model interface. It is intended to be simpler than the full DOM and also +significantly smaller. + +.. note:: + + The :mod:`xml.dom.minidom` module provides an implementation of the W3C-DOM, + with an API similar to that in other programming languages. Users who are + unfamiliar with the W3C-DOM interface or who would like to write less code + for processing XML files should consider using the + :mod:`xml.etree.ElementTree` module instead. DOM applications typically start by parsing some XML into a DOM. With :mod:`xml.dom.minidom`, this is done through the parse functions:: diff -r d8c2ce63f5a4 -r 297b3529876a Doc/tutorial/introduction.rst --- a/Doc/tutorial/introduction.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/tutorial/introduction.rst Fri Jan 25 22:52:26 2013 +0100 @@ -600,19 +600,19 @@ guess when you have typed the last line). Note that each line within a basic block must be indented by the same amount. -* The :func:`print` function writes the value of the argument(s) it is given. - It differs from just writing the expression you want to write (as we did - earlier in the calculator examples) in the way it handles multiple arguments, - floating point quantities, and strings. Strings are printed without quotes, - and a space is inserted between items, so you can format things nicely, like - this:: +* The :func:`print` function writes the value of the expression(s) it is + given. It differs from just writing the expression you want to write (as we did + earlier in the calculator examples) in the way it handles multiple + expressions, floating point quantities, + and strings. Strings are printed without quotes, and a space is inserted + between items, so you can format things nicely, like this:: >>> i = 256*256 >>> print('The value of i is', i) The value of i is 65536 - The keyword argument *end* can be used to avoid the newline after the output, - or end the output with a different string:: + The keyword *end* can be used to avoid the newline after the output, or end + the output with a different string:: >>> a, b = 0, 1 >>> while b < 1000: diff -r d8c2ce63f5a4 -r 297b3529876a Doc/using/cmdline.rst --- a/Doc/using/cmdline.rst Fri Jan 25 23:53:29 2013 +0200 +++ b/Doc/using/cmdline.rst Fri Jan 25 22:52:26 2013 +0100 @@ -191,6 +191,14 @@ options). See also :envvar:`PYTHONDEBUG`. +.. cmdoption:: -e + + Set the default value of the *cloexec* parameter to ``True``: see the + :ref:`close-on-exec flag `. + + .. versionadded:: 3.4 + + .. cmdoption:: -E Ignore all :envvar:`PYTHON*` environment variables, e.g. @@ -559,6 +567,17 @@ Python traceback. This is equivalent to :option:`-X` ``faulthandler`` option. + .. versionadded:: 3.3 + +.. envvar:: PYTHONCLOEXEC + + If this is set, set the default value of the *cloexec* parameter to + ``True``: see the :ref:`close-on-exec flag `. This is equivalent to + :option:`-e` option. + + .. versionadded:: 3.4 + + Debug-mode variables ~~~~~~~~~~~~~~~~~~~~ diff -r d8c2ce63f5a4 -r 297b3529876a Include/fileutils.h --- a/Include/fileutils.h Fri Jan 25 23:53:29 2013 +0200 +++ b/Include/fileutils.h Fri Jan 25 22:52:26 2013 +0100 @@ -5,6 +5,8 @@ extern "C" { #endif +PyAPI_DATA(int) Py_DefaultCloexec; + PyAPI_FUNC(PyObject *) _Py_device_encoding(int); PyAPI_FUNC(wchar_t *) _Py_char2wchar( @@ -27,6 +29,14 @@ struct stat *statbuf); #endif +PyAPI_FUNC(int) _Py_open( + const char *pathname, + int flags); + +PyAPI_FUNC(int) _Py_open_cloexec( + const char *pathname, + int flags); + PyAPI_FUNC(FILE *) _Py_wfopen( const wchar_t *path, const wchar_t *mode); @@ -53,6 +63,16 @@ wchar_t *buf, size_t size); +PyAPI_FUNC(int) _Py_get_cloexec(int fd); + +PyAPI_FUNC(int) _Py_set_cloexec(int fd, int cloexec, int *atomic_flags_works); + +PyAPI_FUNC(void) _Py_try_set_cloexec(int fd, int cloexec); + +PyAPI_FUNC(void) _Py_try_set_default_cloexec(int fd); + +PyAPI_FUNC(int) _Py_cloexec_converter(PyObject* arg, void* addr); + #ifdef __cplusplus } #endif diff -r d8c2ce63f5a4 -r 297b3529876a Lib/_pyio.py --- a/Lib/_pyio.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/_pyio.py Fri Jan 25 22:52:26 2013 +0100 @@ -32,7 +32,7 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None, - newline=None, closefd=True, opener=None): + newline=None, closefd=True, opener=None, cloexec=None): r"""Open file and return a stream. Raise OSError upon failure. @@ -135,6 +135,8 @@ descriptor (passing os.open as *opener* results in functionality similar to passing None). + If cloexec is True, the close-on-exec flag is set. + open() returns a file object whose type depends on the mode, and through which the standard file operations such as reading and writing are performed. When open() is used to open a file in a text mode ('w', @@ -191,7 +193,7 @@ (writing and "w" or "") + (appending and "a" or "") + (updating and "+" or ""), - closefd, opener=opener) + closefd, opener=opener, cloexec=cloexec) line_buffering = False if buffering == 1 or buffering < 0 and raw.isatty(): buffering = -1 diff -r d8c2ce63f5a4 -r 297b3529876a Lib/asyncore.py --- a/Lib/asyncore.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/asyncore.py Fri Jan 25 22:52:26 2013 +0100 @@ -284,9 +284,9 @@ del map[fd] self._fileno = None - def create_socket(self, family=socket.AF_INET, type=socket.SOCK_STREAM): + def create_socket(self, family=socket.AF_INET, type=socket.SOCK_STREAM, cloexec=True): self.family_and_type = family, type - sock = socket.socket(family, type) + sock = socket.socket(family, type, cloexec=cloexec) sock.setblocking(0) self.set_socket(sock) diff -r d8c2ce63f5a4 -r 297b3529876a Lib/cgi.py --- a/Lib/cgi.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/cgi.py Fri Jan 25 22:52:26 2013 +0100 @@ -79,7 +79,7 @@ global log, logfile, logfp if logfile and not logfp: try: - logfp = open(logfile, "a") + logfp = open(logfile, "a", cloexec=True) except OSError: pass if not logfp: @@ -223,17 +223,17 @@ """ import http.client - boundary = b"" + boundary = "" if 'boundary' in pdict: boundary = pdict['boundary'] if not valid_boundary(boundary): raise ValueError('Invalid boundary in multipart form: %r' % (boundary,)) - nextpart = b"--" + boundary - lastpart = b"--" + boundary + b"--" + nextpart = "--" + boundary + lastpart = "--" + boundary + "--" partdict = {} - terminator = b"" + terminator = "" while terminator != lastpart: bytes = -1 @@ -252,7 +252,7 @@ raise ValueError('Maximum content length exceeded') data = fp.read(bytes) else: - data = b"" + data = "" # Read lines until end of part. lines = [] while 1: @@ -260,7 +260,7 @@ if not line: terminator = lastpart # End outer loop break - if line.startswith(b"--"): + if line.startswith("--"): terminator = line.rstrip() if terminator in (nextpart, lastpart): break @@ -272,12 +272,12 @@ if lines: # Strip final line terminator line = lines[-1] - if line[-2:] == b"\r\n": + if line[-2:] == "\r\n": line = line[:-2] - elif line[-1:] == b"\n": + elif line[-1:] == "\n": line = line[:-1] lines[-1] = line - data = b"".join(lines) + data = "".join(lines) line = headers['content-disposition'] if not line: continue diff -r d8c2ce63f5a4 -r 297b3529876a Lib/concurrent/futures/_base.py --- a/Lib/concurrent/futures/_base.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/concurrent/futures/_base.py Fri Jan 25 22:52:26 2013 +0100 @@ -331,7 +331,7 @@ return True def cancelled(self): - """Return True if the future was cancelled.""" + """Return True if the future has cancelled.""" with self._condition: return self._state in [CANCELLED, CANCELLED_AND_NOTIFIED] diff -r d8c2ce63f5a4 -r 297b3529876a Lib/distutils/sysconfig.py --- a/Lib/distutils/sysconfig.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/distutils/sysconfig.py Fri Jan 25 22:52:26 2013 +0100 @@ -24,11 +24,7 @@ # Path to the base directory of the project. On Windows the binary may # live in project/PCBuild9. If we're dealing with an x64 Windows build, # it'll live in project/PCbuild/amd64. -# set for cross builds -if "_PYTHON_PROJECT_BASE" in os.environ: - project_base = os.path.abspath(os.environ["_PYTHON_PROJECT_BASE"]) -else: - project_base = os.path.dirname(os.path.abspath(sys.executable)) +project_base = os.path.dirname(os.path.abspath(sys.executable)) if os.name == "nt" and "pcbuild" in project_base[-8:].lower(): project_base = os.path.abspath(os.path.join(project_base, os.path.pardir)) # PC/VS7.1 @@ -102,7 +98,7 @@ # the build directory may not be the source directory, we # must use "srcdir" from the makefile to find the "Include" # directory. - base = _sys_home or project_base + base = _sys_home or os.path.dirname(os.path.abspath(sys.executable)) if plat_specific: return base if _sys_home: @@ -248,7 +244,8 @@ def get_makefile_filename(): """Return full pathname of installed Makefile from the Python build.""" if python_build: - return os.path.join(_sys_home or project_base, "Makefile") + return os.path.join(_sys_home or os.path.dirname(sys.executable), + "Makefile") lib_dir = get_python_lib(plat_specific=0, standard_lib=1) config_file = 'config-{}{}'.format(get_python_version(), build_flags) return os.path.join(lib_dir, config_file, 'Makefile') @@ -534,7 +531,7 @@ # testing, for example, we might be running a non-installed python # from a different directory. if python_build and os.name == "posix": - base = project_base + base = os.path.dirname(os.path.abspath(sys.executable)) if (not os.path.isabs(_config_vars['srcdir']) and base != os.getcwd()): # srcdir is relative and we are not in the same directory diff -r d8c2ce63f5a4 -r 297b3529876a Lib/getpass.py --- a/Lib/getpass.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/getpass.py Fri Jan 25 22:52:26 2013 +0100 @@ -42,8 +42,8 @@ tty = None try: # Always try reading and writing directly on the tty first. - fd = os.open('/dev/tty', os.O_RDWR|os.O_NOCTTY) - tty = os.fdopen(fd, 'w+', 1) + fd = os.open('/dev/tty', os.O_RDWR|os.O_NOCTTY, cloexec=True) + tty = os.fdopen(fd, 'w+', 1, cloexec=False) input = tty if not stream: stream = tty diff -r d8c2ce63f5a4 -r 297b3529876a Lib/gzip.py --- a/Lib/gzip.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/gzip.py Fri Jan 25 22:52:26 2013 +0100 @@ -65,6 +65,9 @@ # or unsigned. output.write(struct.pack(" self.extrasize: - if not self._read(readsize): - if size > self.extrasize: - size = self.extrasize - break - readsize = min(self.max_read_chunk, readsize * 2) + try: + while size > self.extrasize: + self._read(readsize) + readsize = min(self.max_read_chunk, readsize * 2) + except EOFError: + if size > self.extrasize: + size = self.extrasize offset = self.offset - self.extrastart chunk = self.extrabuf[offset: offset + size] @@ -383,9 +385,12 @@ if self.extrasize <= 0 and self.fileobj is None: return b'' - # For certain input data, a single call to _read() may not return - # any data. In this case, retry until we get some data or reach EOF. - while self.extrasize <= 0 and self._read(): + try: + # For certain input data, a single call to _read() may not return + # any data. In this case, retry until we get some data or reach EOF. + while self.extrasize <= 0: + self._read() + except EOFError: pass if size < 0 or size > self.extrasize: size = self.extrasize @@ -408,9 +413,12 @@ if self.extrasize == 0: if self.fileobj is None: return b'' - # Ensure that we don't return b"" if we haven't reached EOF. - # 1024 is the same buffering heuristic used in read() - while self.extrasize == 0 and self._read(max(n, 1024)): + try: + # Ensure that we don't return b"" if we haven't reached EOF. + while self.extrasize == 0: + # 1024 is the same buffering heuristic used in read() + self._read(max(n, 1024)) + except EOFError: pass offset = self.offset - self.extrastart remaining = self.extrasize @@ -423,14 +431,13 @@ def _read(self, size=1024): if self.fileobj is None: - return False + raise EOFError("Reached EOF") if self._new_member: # If the _new_member flag is set, we have to # jump to the next member, if there is one. self._init_read() - if not self._read_gzip_header(): - return False + self._read_gzip_header() self.decompress = zlib.decompressobj(-zlib.MAX_WBITS) self._new_member = False @@ -447,7 +454,7 @@ self.fileobj.prepend(self.decompress.unused_data, True) self._read_eof() self._add_read_data( uncompress ) - return False + raise EOFError('Reached EOF') uncompress = self.decompress.decompress(buf) self._add_read_data( uncompress ) @@ -463,7 +470,6 @@ # a new member on the next call self._read_eof() self._new_member = True - return True def _add_read_data(self, data): self.crc = zlib.crc32(data, self.crc) & 0xffffffff @@ -478,7 +484,8 @@ # We check the that the computed CRC and size of the # uncompressed data matches the stored values. Note that the size # stored is the true file size mod 2**32. - crc32, isize = struct.unpack("' % self.tags + def writelines(self, lines): + for line in lines: + self.write(line) + + def flush(self): + pass def isatty(self): return True - -class PseudoOutputFile(PseudoFile): - - def writable(self): - return True +class PseudoInputFile(object): + def __init__(self, shell): + self.readline = shell.readline + self.isatty = shell.isatty def write(self, s): - if self.closed: - raise ValueError("write to closed file") - if not isinstance(s, str): - raise TypeError('must be str, not ' + type(s).__name__) - return self.shell.write(s, self.tags) - - -class PseudoInputFile(PseudoFile): - - def __init__(self, shell, tags, encoding=None): - PseudoFile.__init__(self, shell, tags, encoding) - self._line_buffer = '' - - def readable(self): - return True - - def read(self, size=-1): - if self.closed: - raise ValueError("read from closed file") - if size is None: - size = -1 - elif not isinstance(size, int): - raise TypeError('must be int, not ' + type(size).__name__) - result = self._line_buffer - self._line_buffer = '' - if size < 0: - while True: - line = self.shell.readline() - if not line: break - result += line - else: - while len(result) < size: - line = self.shell.readline() - if not line: break - result += line - self._line_buffer = result[size:] - result = result[:size] - return result - - def readline(self, size=-1): - if self.closed: - raise ValueError("read from closed file") - if size is None: - size = -1 - elif not isinstance(size, int): - raise TypeError('must be int, not ' + type(size).__name__) - line = self._line_buffer or self.shell.readline() - if size < 0: - size = len(line) - self._line_buffer = line[size:] - return line[:size] + raise io.UnsupportedOperation("not writable") + writelines = write usage_msg = """\ diff -r d8c2ce63f5a4 -r 297b3529876a Lib/idlelib/run.py --- a/Lib/idlelib/run.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/idlelib/run.py Fri Jan 25 22:52:26 2013 +0100 @@ -16,8 +16,6 @@ from idlelib import RemoteObjectBrowser from idlelib import StackViewer from idlelib import rpc -from idlelib import PyShell -from idlelib import IOBinding import __main__ @@ -279,24 +277,63 @@ quitting = True thread.interrupt_main() +class _RPCFile(io.TextIOBase): + """Wrapper class for the RPC proxy to typecheck arguments + that may not support pickling. The base class is there only + to support type tests; all implementations come from the remote + object.""" + + def __init__(self, rpc): + super.__setattr__(self, 'rpc', rpc) + + def __getattribute__(self, name): + # When accessing the 'rpc' attribute, or 'write', use ours + if name in ('rpc', 'write', 'writelines'): + return io.TextIOBase.__getattribute__(self, name) + # Else only look into the remote object only + return getattr(self.rpc, name) + + def __setattr__(self, name, value): + return setattr(self.rpc, name, value) + + @staticmethod + def _ensure_string(func): + def f(self, s): + if not isinstance(s, str): + raise TypeError('must be str, not ' + type(s).__name__) + return func(self, s) + return f + +class _RPCOutputFile(_RPCFile): + @_RPCFile._ensure_string + def write(self, s): + if not isinstance(s, str): + raise TypeError('must be str, not ' + type(s).__name__) + return self.rpc.write(s) + +class _RPCInputFile(_RPCFile): + @_RPCFile._ensure_string + def write(self, s): + raise io.UnsupportedOperation("not writable") + writelines = write + class MyHandler(rpc.RPCHandler): def handle(self): """Override base method""" executive = Executive(self) self.register("exec", executive) - self.console = self.get_remote_proxy("console") - sys.stdin = PyShell.PseudoInputFile(self.console, "stdin", - IOBinding.encoding) - sys.stdout = PyShell.PseudoOutputFile(self.console, "stdout", - IOBinding.encoding) - sys.stderr = PyShell.PseudoOutputFile(self.console, "stderr", - IOBinding.encoding) - + self.console = self.get_remote_proxy("stdin") + sys.stdin = _RPCInputFile(self.console) + sys.stdout = _RPCOutputFile(self.get_remote_proxy("stdout")) + sys.stderr = _RPCOutputFile(self.get_remote_proxy("stderr")) sys.displayhook = rpc.displayhook # page help() text to shell. import pydoc # import must be done here to capture i/o binding pydoc.pager = pydoc.plainpager + from idlelib import IOBinding + sys.stdin.encoding = sys.stdout.encoding = \ + sys.stderr.encoding = IOBinding.encoding self.interp = self.get_remote_proxy("interp") rpc.RPCHandler.getresponse(self, myseq=None, wait=0.05) diff -r d8c2ce63f5a4 -r 297b3529876a Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/importlib/_bootstrap.py Fri Jan 25 22:52:26 2013 +0100 @@ -125,7 +125,9 @@ # id() is used to generate a pseudo-random filename. path_tmp = '{}.{}'.format(path, id(path)) fd = _os.open(path_tmp, - _os.O_EXCL | _os.O_CREAT | _os.O_WRONLY, mode & 0o666) + _os.O_EXCL | _os.O_CREAT | _os.O_WRONLY, + mode & 0o666, + cloexec=True) try: # We first write data to a temporary file, and then use os.replace() to # perform an atomic rename. @@ -639,21 +641,21 @@ exc_details['name'] = name else: # To prevent having to make all messages have a conditional name. - name = '' + name = 'bytecode' if path is not None: exc_details['path'] = path magic = data[:4] raw_timestamp = data[4:8] raw_size = data[8:12] if magic != _MAGIC_BYTES: - msg = 'incomplete magic number in {!r}: {!r}'.format(name, magic) + msg = 'bad magic number in {!r}: {!r}'.format(name, magic) raise ImportError(msg, **exc_details) elif len(raw_timestamp) != 4: - message = 'incomplete timestamp in {!r}'.format(name) + message = 'bad timestamp in {!r}'.format(name) _verbose_message(message) raise EOFError(message) elif len(raw_size) != 4: - message = 'incomplete size in {!r}'.format(name) + message = 'bad size in {!r}'.format(name) _verbose_message(message) raise EOFError(message) if source_stats is not None: diff -r d8c2ce63f5a4 -r 297b3529876a Lib/logging/__init__.py --- a/Lib/logging/__init__.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/logging/__init__.py Fri Jan 25 22:52:26 2013 +0100 @@ -994,7 +994,8 @@ Open the current base file with the (original) mode and encoding. Return the resulting stream. """ - return open(self.baseFilename, self.mode, encoding=self.encoding) + return open(self.baseFilename, self.mode, + encoding=self.encoding, cloexec=True) def emit(self, record): """ diff -r d8c2ce63f5a4 -r 297b3529876a Lib/multiprocessing/forking.py --- a/Lib/multiprocessing/forking.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/multiprocessing/forking.py Fri Jan 25 22:52:26 2013 +0100 @@ -211,13 +211,13 @@ prep_data = get_preparation_data(process_obj._name) # create pipe for communication with child - rfd, wfd = os.pipe() + rfd, wfd = os.pipe(cloexec=False) # get handle for read end of the pipe and make it inheritable rhandle = duplicate(msvcrt.get_osfhandle(rfd), inheritable=True) os.close(rfd) - with open(wfd, 'wb', closefd=True) as to_child: + with open(wfd, 'wb', closefd=True, cloexec=False) as to_child: # start process try: hp, ht, pid, tid = _winapi.CreateProcess( @@ -337,7 +337,7 @@ handle = int(sys.argv[-1]) fd = msvcrt.open_osfhandle(handle, os.O_RDONLY) - from_parent = os.fdopen(fd, 'rb') + from_parent = os.fdopen(fd, 'rb', cloexec=True) process.current_process()._inheriting = True preparation_data = load(from_parent) diff -r d8c2ce63f5a4 -r 297b3529876a Lib/multiprocessing/process.py --- a/Lib/multiprocessing/process.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/multiprocessing/process.py Fri Jan 25 22:52:26 2013 +0100 @@ -241,7 +241,7 @@ if sys.stdin is not None: try: sys.stdin.close() - sys.stdin = open(os.devnull) + sys.stdin = open(os.devnull, cloexec=False) except (OSError, ValueError): pass old_process = _current_process diff -r d8c2ce63f5a4 -r 297b3529876a Lib/os.py --- a/Lib/os.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/os.py Fri Jan 25 22:52:26 2013 +0100 @@ -439,7 +439,7 @@ # Note: To guard against symlink races, we use the standard # lstat()/open()/fstat() trick. orig_st = stat(top, follow_symlinks=False, dir_fd=dir_fd) - topfd = open(top, O_RDONLY, dir_fd=dir_fd) + topfd = open(top, O_RDONLY, dir_fd=dir_fd, cloexec=True) try: if (follow_symlinks or (st.S_ISDIR(orig_st.st_mode) and path.samestat(orig_st, stat(topfd)))): @@ -479,7 +479,7 @@ for name in dirs: try: orig_st = stat(name, dir_fd=topfd, follow_symlinks=follow_symlinks) - dirfd = open(name, O_RDONLY, dir_fd=topfd) + dirfd = open(name, O_RDONLY, dir_fd=topfd, cloexec=True) except OSError as err: if onerror is not None: onerror(err) diff -r d8c2ce63f5a4 -r 297b3529876a Lib/plat-generic/regen --- a/Lib/plat-generic/regen Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/plat-generic/regen Fri Jan 25 22:52:26 2013 +0100 @@ -1,3 +1,3 @@ #! /bin/sh set -v -eval $PYTHON_FOR_BUILD ../../Tools/scripts/h2py.py -i "'(u_long)'" /usr/include/netinet/in.h +python$EXE ../../Tools/scripts/h2py.py -i '(u_long)' /usr/include/netinet/in.h diff -r d8c2ce63f5a4 -r 297b3529876a Lib/pty.py --- a/Lib/pty.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/pty.py Fri Jan 25 22:52:26 2013 +0100 @@ -63,7 +63,7 @@ for y in '0123456789abcdef': pty_name = '/dev/pty' + x + y try: - fd = os.open(pty_name, os.O_RDWR) + fd = os.open(pty_name, os.O_RDWR, cloexec=True) except OSError: continue return (fd, '/dev/tty' + x + y) @@ -75,7 +75,7 @@ opened filedescriptor. Deprecated, use openpty() instead.""" - result = os.open(tty_name, os.O_RDWR) + result = os.open(tty_name, os.O_RDWR, cloexec=True) try: from fcntl import ioctl, I_PUSH except ImportError: @@ -112,14 +112,14 @@ os.close(master_fd) # Slave becomes stdin/stdout/stderr of child. - os.dup2(slave_fd, STDIN_FILENO) - os.dup2(slave_fd, STDOUT_FILENO) - os.dup2(slave_fd, STDERR_FILENO) + os.dup2(slave_fd, STDIN_FILENO, cloexec=False) + os.dup2(slave_fd, STDOUT_FILENO, cloexec=False) + os.dup2(slave_fd, STDERR_FILENO, cloexec=False) if (slave_fd > STDERR_FILENO): os.close (slave_fd) # Explicitly open the tty to make it become a controlling tty. - tmp_fd = os.open(os.ttyname(STDOUT_FILENO), os.O_RDWR) + tmp_fd = os.open(os.ttyname(STDOUT_FILENO), os.O_RDWR, cloexec=True) os.close(tmp_fd) else: os.close(slave_fd) diff -r d8c2ce63f5a4 -r 297b3529876a Lib/pydoc.py --- a/Lib/pydoc.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/pydoc.py Fri Jan 25 22:52:26 2013 +0100 @@ -265,7 +265,7 @@ def importfile(path): """Import a Python source file or compiled file given its path.""" magic = imp.get_magic() - with open(path, 'rb') as file: + with open(path, 'rb', cloexec=True) as file: if file.read(len(magic)) == magic: kind = imp.PY_COMPILED else: @@ -1426,7 +1426,7 @@ """Page through text by invoking a program on a temporary file.""" import tempfile filename = tempfile.mktemp() - file = open(filename, 'w') + file = open(filename, 'w', cloexec=True) file.write(text) file.close() try: @@ -1580,7 +1580,7 @@ try: object, name = resolve(thing, forceload) page = html.page(describe(object), html.document(object, name)) - file = open(name + '.html', 'w', encoding='utf-8') + file = open(name + '.html', 'w', encoding='utf-8', cloexec=True) file.write(page) file.close() print('wrote', name + '.html') @@ -2471,7 +2471,7 @@ if content_type == 'text/css': path_here = os.path.dirname(os.path.realpath(__file__)) css_path = os.path.join(path_here, url) - with open(css_path) as fp: + with open(css_path, cloexec=True) as fp: return ''.join(fp.readlines()) elif content_type == 'text/html': return get_html_page(url) diff -r d8c2ce63f5a4 -r 297b3529876a Lib/shutil.py --- a/Lib/shutil.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/shutil.py Fri Jan 25 22:52:26 2013 +0100 @@ -104,8 +104,8 @@ if not follow_symlinks and os.path.islink(src): os.symlink(os.readlink(src), dst) else: - with open(src, 'rb') as fsrc: - with open(dst, 'wb') as fdst: + with open(src, 'rb', cloexec=True) as fsrc: + with open(dst, 'wb', cloexec=True) as fdst: copyfileobj(fsrc, fdst) return dst @@ -386,7 +386,7 @@ mode = 0 if stat.S_ISDIR(mode): try: - dirfd = os.open(name, os.O_RDONLY, dir_fd=topfd) + dirfd = os.open(name, os.O_RDONLY, dir_fd=topfd, cloexec=True) except OSError: onerror(os.open, fullname, sys.exc_info()) else: @@ -448,7 +448,7 @@ onerror(os.lstat, path, sys.exc_info()) return try: - fd = os.open(path, os.O_RDONLY) + fd = os.open(path, os.O_RDONLY, cloexec=True) except Exception: onerror(os.lstat, path, sys.exc_info()) return @@ -875,7 +875,7 @@ if not name.endswith('/'): # file data = zip.read(info.filename) - f = open(target, 'wb') + f = open(target, 'wb', cloexec=True) try: f.write(data) finally: @@ -1076,13 +1076,10 @@ return (os.path.exists(fn) and os.access(fn, mode) and not os.path.isdir(fn)) - # If we're given a path with a directory part, look it up directly rather - # than referring to PATH directories. This includes checking relative to the - # current directory, e.g. ./script - if os.path.dirname(cmd): - if _access_check(cmd, mode): - return cmd - return None + # Short circuit. If we're given a full path which matches the mode + # and it exists, we're done here. + if _access_check(cmd, mode): + return cmd path = (path or os.environ.get("PATH", os.defpath)).split(os.pathsep) @@ -1095,12 +1092,10 @@ pathext = os.environ.get("PATHEXT", "").split(os.pathsep) # See if the given file matches any of the expected path extensions. # This will allow us to short circuit when given "python.exe". + matches = [cmd for ext in pathext if cmd.lower().endswith(ext.lower())] # If it does match, only test that one, otherwise we have to try # others. - if any(cmd.lower().endswith(ext.lower()) for ext in pathext): - files = [cmd] - else: - files = [cmd + ext for ext in pathext] + files = [cmd] if matches else [cmd + ext.lower() for ext in pathext] else: # On other platforms you don't have things like PATHEXT to tell you # what file suffixes are executable, so just pass on cmd as-is. @@ -1108,9 +1103,9 @@ seen = set() for dir in path: - normdir = os.path.normcase(dir) - if not normdir in seen: - seen.add(normdir) + dir = os.path.normcase(dir) + if not dir in seen: + seen.add(dir) for thefile in files: name = os.path.join(dir, thefile) if _access_check(name, mode): diff -r d8c2ce63f5a4 -r 297b3529876a Lib/site.py --- a/Lib/site.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/site.py Fri Jan 25 22:52:26 2013 +0100 @@ -146,7 +146,7 @@ and add that to known_paths, or execute it if it starts with 'import '. """ if known_paths is None: - known_paths = _init_pathinfo() + _init_pathinfo() reset = 1 else: reset = 0 diff -r d8c2ce63f5a4 -r 297b3529876a Lib/socket.py --- a/Lib/socket.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/socket.py Fri Jan 25 22:52:26 2013 +0100 @@ -90,8 +90,8 @@ __slots__ = ["__weakref__", "_io_refs", "_closed"] - def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None): - _socket.socket.__init__(self, family, type, proto, fileno) + def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None, cloexec=None): + _socket.socket.__init__(self, family, type, proto, fileno, cloexec) self._io_refs = 0 self._closed = False @@ -125,14 +125,14 @@ sock.settimeout(self.gettimeout()) return sock - def accept(self): + def accept(self, cloexec=None): """accept() -> (socket object, address info) Wait for an incoming connection. Return a new socket representing the connection, and the address of the client. For IP sockets, the address info is a pair (hostaddr, port). """ - fd, addr = self._accept() + fd, addr = self._accept(cloexec=cloexec) sock = socket(self.family, self.type, self.proto, fileno=fd) # Issue #7995: if no default timeout is set and the listening # socket had a (non-zero) timeout, force the new socket in blocking @@ -230,7 +230,7 @@ if hasattr(_socket, "socketpair"): - def socketpair(family=None, type=SOCK_STREAM, proto=0): + def socketpair(family=None, type=SOCK_STREAM, proto=0, cloexec=None): """socketpair([family[, type[, proto]]]) -> (socket object, socket object) Create a pair of socket objects from the sockets returned by the platform @@ -243,9 +243,9 @@ family = AF_UNIX except NameError: family = AF_INET - a, b = _socket.socketpair(family, type, proto) - a = socket(family, type, proto, a.detach()) - b = socket(family, type, proto, b.detach()) + a, b = _socket.socketpair(family, type, proto, cloexec=cloexec) + a = socket(family, type, proto, a.detach(), cloexec=False) + b = socket(family, type, proto, b.detach(), cloexec=False) return a, b diff -r d8c2ce63f5a4 -r 297b3529876a Lib/sre_constants.py --- a/Lib/sre_constants.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/sre_constants.py Fri Jan 25 22:52:26 2013 +0100 @@ -219,7 +219,8 @@ if __name__ == "__main__": def dump(f, d, prefix): - items = sorted(d.items(), key=lambda a: a[1]) + items = d.items() + items.sort(key=lambda a: a[1]) for k, v in items: f.write("#define %s_%s %s\n" % (prefix, k.upper(), v)) f = open("sre_constants.h", "w") diff -r d8c2ce63f5a4 -r 297b3529876a Lib/subprocess.py --- a/Lib/subprocess.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/subprocess.py Fri Jan 25 22:52:26 2013 +0100 @@ -400,7 +400,6 @@ import select _has_poll = hasattr(select, 'poll') import _posixsubprocess - _create_pipe = _posixsubprocess.cloexec_pipe # When select or poll has indicated that the file is writable, # we can write up to _PIPE_BUF bytes without risk of blocking. @@ -794,15 +793,15 @@ errread = msvcrt.open_osfhandle(errread.Detach(), 0) if p2cwrite != -1: - self.stdin = io.open(p2cwrite, 'wb', bufsize) + self.stdin = io.open(p2cwrite, 'wb', bufsize, cloexec=False) if universal_newlines: self.stdin = io.TextIOWrapper(self.stdin, write_through=True) if c2pread != -1: - self.stdout = io.open(c2pread, 'rb', bufsize) + self.stdout = io.open(c2pread, 'rb', bufsize, cloexec=False) if universal_newlines: self.stdout = io.TextIOWrapper(self.stdout) if errread != -1: - self.stderr = io.open(errread, 'rb', bufsize) + self.stderr = io.open(errread, 'rb', bufsize, cloexec=False) if universal_newlines: self.stderr = io.TextIOWrapper(self.stderr) @@ -871,7 +870,7 @@ def _get_devnull(self): if not hasattr(self, '_devnull'): - self._devnull = os.open(os.devnull, os.O_RDWR) + self._devnull = os.open(os.devnull, os.O_RDWR, cloexec=False) return self._devnull def communicate(self, input=None, timeout=None): @@ -1230,7 +1229,7 @@ if stdin is None: pass elif stdin == PIPE: - p2cread, p2cwrite = _create_pipe() + p2cread, p2cwrite = os.pipe(cloexec=True) elif stdin == DEVNULL: p2cread = self._get_devnull() elif isinstance(stdin, int): @@ -1242,7 +1241,7 @@ if stdout is None: pass elif stdout == PIPE: - c2pread, c2pwrite = _create_pipe() + c2pread, c2pwrite = os.pipe(cloexec=True) elif stdout == DEVNULL: c2pwrite = self._get_devnull() elif isinstance(stdout, int): @@ -1254,7 +1253,7 @@ if stderr is None: pass elif stderr == PIPE: - errread, errwrite = _create_pipe() + errread, errwrite = os.pipe(cloexec=True) elif stderr == STDOUT: errwrite = c2pwrite elif stderr == DEVNULL: @@ -1306,7 +1305,7 @@ # For transferring possible exec failure from child to parent. # Data format: "exception name:hex errno:description" # Pickle is not used; it is complex and involves memory allocation. - errpipe_read, errpipe_write = _create_pipe() + errpipe_read, errpipe_write = os.pipe(cloexec=True) try: try: # We must avoid complex work that could involve diff -r d8c2ce63f5a4 -r 297b3529876a Lib/tempfile.py --- a/Lib/tempfile.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/tempfile.py Fri Jan 25 22:52:26 2013 +0100 @@ -34,33 +34,12 @@ from random import Random as _Random try: - import fcntl as _fcntl -except ImportError: - def _set_cloexec(fd): - pass -else: - def _set_cloexec(fd): - try: - flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0) - except OSError: - pass - else: - # flags read successfully, modify - flags |= _fcntl.FD_CLOEXEC - _fcntl.fcntl(fd, _fcntl.F_SETFD, flags) - - -try: import _thread except ImportError: import _dummy_thread as _thread _allocate_lock = _thread.allocate_lock _text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL -if hasattr(_os, 'O_CLOEXEC'): - _text_openflags |= _os.O_CLOEXEC -if hasattr(_os, 'O_NOINHERIT'): - _text_openflags |= _os.O_NOINHERIT if hasattr(_os, 'O_NOFOLLOW'): _text_openflags |= _os.O_NOFOLLOW @@ -89,8 +68,8 @@ # Fallback. All we need is something that raises OSError if the # file doesn't exist. def _stat(fn): - f = open(fn) - f.close() + fd = _os.open(fn, _os.O_RDONLY, cloexec=False) + os.close(fd) def _exists(fn): try: @@ -172,8 +151,8 @@ name = next(namer) filename = _os.path.join(dir, name) try: - fd = _os.open(filename, _bin_openflags, 0o600) - fp = _io.open(fd, 'wb') + fd = _os.open(filename, _bin_openflags, 0o600, cloexec=True) + fp = _io.open(fd, 'wb', cloexec=False) fp.write(b'blat') fp.close() _os.unlink(filename) @@ -210,8 +189,7 @@ name = next(names) file = _os.path.join(dir, pre + name + suf) try: - fd = _os.open(file, flags, 0o600) - _set_cloexec(fd) + fd = _os.open(file, flags, 0o600, cloexec=True) return (fd, _os.path.abspath(file)) except FileExistsError: continue # try again @@ -431,7 +409,7 @@ (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags) file = _io.open(fd, mode, buffering=buffering, - newline=newline, encoding=encoding) + newline=newline, encoding=encoding, cloexec=False) return _TemporaryFileWrapper(file, name, delete) @@ -466,7 +444,7 @@ try: _os.unlink(name) return _io.open(fd, mode, buffering=buffering, - newline=newline, encoding=encoding) + newline=newline, encoding=encoding, cloexec=False) except: _os.close(fd) raise diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/mock_socket.py --- a/Lib/test/mock_socket.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/mock_socket.py Fri Jan 25 22:52:26 2013 +0100 @@ -102,7 +102,7 @@ pass -def socket(family=None, type=None, proto=None): +def socket(family=None, type=None, proto=None, cloexec=True): return MockSocket() diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_asyncore.py --- a/Lib/test/test_asyncore.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_asyncore.py Fri Jan 25 22:52:26 2013 +0100 @@ -739,7 +739,7 @@ def test_create_socket(self): s = asyncore.dispatcher() - s.create_socket(self.family) + s.create_socket(self.family, cloexec=False) self.assertEqual(s.socket.family, self.family) SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0) self.assertEqual(s.socket.type, socket.SOCK_STREAM | SOCK_NONBLOCK) diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_builtin.py --- a/Lib/test/test_builtin.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_builtin.py Fri Jan 25 22:52:26 2013 +0100 @@ -943,29 +943,24 @@ def write_testfile(self): # NB the first 4 lines are also used to test input, below fp = open(TESTFN, 'w') - try: + self.addCleanup(unlink, TESTFN) + with fp: fp.write('1+1\n') fp.write('The quick brown fox jumps over the lazy dog') fp.write('.\n') fp.write('Dear John\n') fp.write('XXX'*100) fp.write('YYY'*100) - finally: - fp.close() def test_open(self): self.write_testfile() - fp = open(TESTFN, 'r') - try: + with open(TESTFN, 'r') as fp: self.assertEqual(fp.readline(4), '1+1\n') self.assertEqual(fp.readline(), 'The quick brown fox jumps over the lazy dog.\n') self.assertEqual(fp.readline(4), 'Dear') self.assertEqual(fp.readline(100), ' John\n') self.assertEqual(fp.read(300), 'XXX'*100) self.assertEqual(fp.read(1000), 'YYY'*100) - finally: - fp.close() - unlink(TESTFN) def test_open_default_encoding(self): old_environ = dict(os.environ) @@ -979,16 +974,30 @@ self.write_testfile() current_locale_encoding = locale.getpreferredencoding(False) - fp = open(TESTFN, 'w') - try: + with open(TESTFN, 'w') as fp: self.assertEqual(fp.encoding, current_locale_encoding) - finally: - fp.close() - unlink(TESTFN) finally: os.environ.clear() os.environ.update(old_environ) + @unittest.skipUnless(hasattr(os, "get_cloexec"), "need os.get_cloexec()") + def test_open_cloexec(self): + self.write_testfile() + orig_cloexec = sys.getdefaultcloexec() + try: + for cloexec in (False, True): + for use_default in (False, True): + if use_default: + sys.setdefaultcloexec(cloexec) + fileobj = open(TESTFN) + else: + sys.setdefaultcloexec(not cloexec) + fileobj = open(TESTFN, cloexec=cloexec) + with fileobj: + self.assertEqual(os.get_cloexec(fileobj.fileno()), cloexec) + finally: + sys.setdefaultcloexec(orig_cloexec) + def test_ord(self): self.assertEqual(ord(' '), 32) self.assertEqual(ord('A'), 65) diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_bz2.py --- a/Lib/test/test_bz2.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_bz2.py Fri Jan 25 22:52:26 2013 +0100 @@ -569,19 +569,6 @@ bz2f.seek(-150, 1) self.assertEqual(bz2f.read(), self.TEXT[500-150:]) - def test_read_truncated(self): - # Drop the eos_magic field (6 bytes) and CRC (4 bytes). - truncated = self.DATA[:-10] - with BZ2File(BytesIO(truncated)) as f: - self.assertRaises(EOFError, f.read) - with BZ2File(BytesIO(truncated)) as f: - self.assertEqual(f.read(len(self.TEXT)), self.TEXT) - self.assertRaises(EOFError, f.read, 1) - # Incomplete 4-byte file header, and block header of at least 146 bits. - for i in range(22): - with BZ2File(BytesIO(truncated[:i])) as f: - self.assertRaises(EOFError, f.read, 1) - class BZ2CompressorTest(BaseTest): def testCompress(self): diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_capi.py --- a/Lib/test/test_capi.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_capi.py Fri Jan 25 22:52:26 2013 +0100 @@ -193,6 +193,7 @@ self.pendingcalls_wait(l, n) def test_subinterps(self): + # XXX this test leaks in refleak runs import builtins r, w = os.pipe() code = """if 1: diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_cgi.py --- a/Lib/test/test_cgi.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_cgi.py Fri Jan 25 22:52:26 2013 +0100 @@ -5,7 +5,6 @@ import tempfile import unittest import warnings -from collections import namedtuple from io import StringIO, BytesIO class HackedSysModule: @@ -120,23 +119,6 @@ class CgiTests(unittest.TestCase): - def test_parse_multipart(self): - fp = BytesIO(POSTDATA.encode('latin1')) - env = {'boundary': BOUNDARY.encode('latin1'), - 'CONTENT-LENGTH': '558'} - result = cgi.parse_multipart(fp, env) - expected = {'submit': [b' Add '], 'id': [b'1234'], - 'file': [b'Testing 123.\n'], 'title': [b'']} - self.assertEqual(result, expected) - - def test_fieldstorage_properties(self): - fs = cgi.FieldStorage() - self.assertFalse(fs) - self.assertIn("FieldStorage", repr(fs)) - self.assertEqual(list(fs), list(fs.keys())) - fs.list.append(namedtuple('MockFieldStorage', 'name')('fieldvalue')) - self.assertTrue(fs) - def test_escape(self): # cgi.escape() is deprecated. with warnings.catch_warnings(): diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_codecs.py --- a/Lib/test/test_codecs.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_codecs.py Fri Jan 25 22:52:26 2013 +0100 @@ -927,50 +927,6 @@ def test_empty(self): self.assertEqual(codecs.escape_decode(""), (b"", 0)) - def test_raw(self): - for b in range(256): - if b != b'\\'[0]: - self.assertEqual(codecs.escape_decode(bytes([b]) + b'0'), - (bytes([b]) + b'0', 2)) - - def test_escape(self): - self.assertEqual(codecs.escape_decode(b"[\\\n]"), (b"[]", 4)) - self.assertEqual(codecs.escape_decode(br'[\"]'), (b'["]', 4)) - self.assertEqual(codecs.escape_decode(br"[\']"), (b"[']", 4)) - self.assertEqual(codecs.escape_decode(br"[\\]"), (br"[\]", 4)) - self.assertEqual(codecs.escape_decode(br"[\a]"), (b"[\x07]", 4)) - self.assertEqual(codecs.escape_decode(br"[\b]"), (b"[\x08]", 4)) - self.assertEqual(codecs.escape_decode(br"[\t]"), (b"[\x09]", 4)) - self.assertEqual(codecs.escape_decode(br"[\n]"), (b"[\x0a]", 4)) - self.assertEqual(codecs.escape_decode(br"[\v]"), (b"[\x0b]", 4)) - self.assertEqual(codecs.escape_decode(br"[\f]"), (b"[\x0c]", 4)) - self.assertEqual(codecs.escape_decode(br"[\r]"), (b"[\x0d]", 4)) - self.assertEqual(codecs.escape_decode(br"[\7]"), (b"[\x07]", 4)) - self.assertEqual(codecs.escape_decode(br"[\8]"), (br"[\8]", 4)) - self.assertEqual(codecs.escape_decode(br"[\78]"), (b"[\x078]", 5)) - self.assertEqual(codecs.escape_decode(br"[\41]"), (b"[!]", 5)) - self.assertEqual(codecs.escape_decode(br"[\418]"), (b"[!8]", 6)) - self.assertEqual(codecs.escape_decode(br"[\101]"), (b"[A]", 6)) - self.assertEqual(codecs.escape_decode(br"[\1010]"), (b"[A0]", 7)) - self.assertEqual(codecs.escape_decode(br"[\501]"), (b"[A]", 6)) - self.assertEqual(codecs.escape_decode(br"[\x41]"), (b"[A]", 6)) - self.assertEqual(codecs.escape_decode(br"[\X41]"), (br"[\X41]", 6)) - self.assertEqual(codecs.escape_decode(br"[\x410]"), (b"[A0]", 7)) - for b in range(256): - if b not in b'\n"\'\\abtnvfr01234567x': - self.assertEqual(codecs.escape_decode(b'\\' + bytes([b])), - (b'\\' + bytes([b]), 2)) - - def test_errors(self): - self.assertRaises(ValueError, codecs.escape_decode, br"\x") - self.assertRaises(ValueError, codecs.escape_decode, br"[\x]") - self.assertEqual(codecs.escape_decode(br"[\x]\x", "ignore"), (b"[]", 6)) - self.assertEqual(codecs.escape_decode(br"[\x]\x", "replace"), (b"[?]?", 6)) - self.assertRaises(ValueError, codecs.escape_decode, br"\x0") - self.assertRaises(ValueError, codecs.escape_decode, br"[\x0]") - self.assertEqual(codecs.escape_decode(br"[\x0]\x0", "ignore"), (b"[]", 8)) - self.assertEqual(codecs.escape_decode(br"[\x0]\x0", "replace"), (b"[?]?", 8)) - class RecodingTest(unittest.TestCase): def test_recoding(self): f = io.BytesIO() diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_decimal.py --- a/Lib/test/test_decimal.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_decimal.py Fri Jan 25 22:52:26 2013 +0100 @@ -4971,16 +4971,22 @@ def test_c_format(self): # Restricted input Decimal = C.Decimal + InvalidOperation = C.InvalidOperation + Rounded = C.Rounded + localcontext = C.localcontext HAVE_CONFIG_64 = (C.MAX_PREC > 425000000) self.assertRaises(TypeError, Decimal(1).__format__, "=10.10", [], 9) self.assertRaises(TypeError, Decimal(1).__format__, "=10.10", 9) self.assertRaises(TypeError, Decimal(1).__format__, []) - self.assertRaises(ValueError, Decimal(1).__format__, "<>=10.10") - maxsize = 2**63-1 if HAVE_CONFIG_64 else 2**31-1 - self.assertRaises(ValueError, Decimal("1.23456789").__format__, - "=%d.1" % maxsize) + with localcontext() as c: + c.traps[InvalidOperation] = True + c.traps[Rounded] = True + self.assertRaises(ValueError, Decimal(1).__format__, "<>=10.10") + maxsize = 2**63-1 if HAVE_CONFIG_64 else 2**31-1 + self.assertRaises(InvalidOperation, Decimal("1.23456789").__format__, + "=%d.1" % maxsize) def test_c_integral(self): Decimal = C.Decimal diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_dictcomps.py --- a/Lib/test/test_dictcomps.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_dictcomps.py Fri Jan 25 22:52:26 2013 +0100 @@ -1,88 +1,54 @@ -import unittest -from test import support +doctests = """ -# For scope testing. -g = "Global variable" + >>> k = "old value" + >>> { k: None for k in range(10) } + {0: None, 1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None} + >>> k + 'old value' + >>> { k: k+10 for k in range(10) } + {0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, 8: 18, 9: 19} -class DictComprehensionTest(unittest.TestCase): + >>> g = "Global variable" + >>> { k: g for k in range(10) } + {0: 'Global variable', 1: 'Global variable', 2: 'Global variable', 3: 'Global variable', 4: 'Global variable', 5: 'Global variable', 6: 'Global variable', 7: 'Global variable', 8: 'Global variable', 9: 'Global variable'} - def test_basics(self): - expected = {0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, - 8: 18, 9: 19} - actual = {k: k + 10 for k in range(10)} - self.assertEqual(actual, expected) + >>> { k: v for k in range(10) for v in range(10) if k == v } + {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9} - expected = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9} - actual = {k: v for k in range(10) for v in range(10) if k == v} - self.assertEqual(actual, expected) + >>> { k: v for v in range(10) for k in range(v*9, v*10) } + {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, 38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6, 55: 6, 56: 6, 57: 6, 58: 6, 59: 6, 63: 7, 64: 7, 65: 7, 66: 7, 67: 7, 68: 7, 69: 7, 72: 8, 73: 8, 74: 8, 75: 8, 76: 8, 77: 8, 78: 8, 79: 8, 81: 9, 82: 9, 83: 9, 84: 9, 85: 9, 86: 9, 87: 9, 88: 9, 89: 9} - def test_scope_isolation(self): - k = "Local Variable" + >>> { x: y for y, x in ((1, 2), (3, 4)) } = 5 # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + SyntaxError: ... - expected = {0: None, 1: None, 2: None, 3: None, 4: None, 5: None, - 6: None, 7: None, 8: None, 9: None} - actual = {k: None for k in range(10)} - self.assertEqual(actual, expected) - self.assertEqual(k, "Local Variable") + >>> { x: y for y, x in ((1, 2), (3, 4)) } += 5 # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + SyntaxError: ... - expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, - 38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6, - 55: 6, 56: 6, 57: 6, 58: 6, 59: 6, 63: 7, 64: 7, 65: 7, - 66: 7, 67: 7, 68: 7, 69: 7, 72: 8, 73: 8, 74: 8, 75: 8, - 76: 8, 77: 8, 78: 8, 79: 8, 81: 9, 82: 9, 83: 9, 84: 9, - 85: 9, 86: 9, 87: 9, 88: 9, 89: 9} - actual = {k: v for v in range(10) for k in range(v * 9, v * 10)} - self.assertEqual(k, "Local Variable") - self.assertEqual(actual, expected) +""" - def test_scope_isolation_from_global(self): - expected = {0: None, 1: None, 2: None, 3: None, 4: None, 5: None, - 6: None, 7: None, 8: None, 9: None} - actual = {g: None for g in range(10)} - self.assertEqual(actual, expected) - self.assertEqual(g, "Global variable") +__test__ = {'doctests' : doctests} - expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, - 38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6, - 55: 6, 56: 6, 57: 6, 58: 6, 59: 6, 63: 7, 64: 7, 65: 7, - 66: 7, 67: 7, 68: 7, 69: 7, 72: 8, 73: 8, 74: 8, 75: 8, - 76: 8, 77: 8, 78: 8, 79: 8, 81: 9, 82: 9, 83: 9, 84: 9, - 85: 9, 86: 9, 87: 9, 88: 9, 89: 9} - actual = {g: v for v in range(10) for g in range(v * 9, v * 10)} - self.assertEqual(g, "Global variable") - self.assertEqual(actual, expected) +def test_main(verbose=None): + import sys + from test import support + from test import test_dictcomps + support.run_doctest(test_dictcomps, verbose) - def test_global_visibility(self): - expected = {0: 'Global variable', 1: 'Global variable', - 2: 'Global variable', 3: 'Global variable', - 4: 'Global variable', 5: 'Global variable', - 6: 'Global variable', 7: 'Global variable', - 8: 'Global variable', 9: 'Global variable'} - actual = {k: g for k in range(10)} - self.assertEqual(actual, expected) - - def test_local_visibility(self): - v = "Local variable" - expected = {0: 'Local variable', 1: 'Local variable', - 2: 'Local variable', 3: 'Local variable', - 4: 'Local variable', 5: 'Local variable', - 6: 'Local variable', 7: 'Local variable', - 8: 'Local variable', 9: 'Local variable'} - actual = {k: v for k in range(10)} - self.assertEqual(actual, expected) - self.assertEqual(v, "Local variable") - - def test_illegal_assignment(self): - with self.assertRaisesRegex(SyntaxError, "can't assign"): - compile("{x: y for y, x in ((1, 2), (3, 4))} = 5", "", - "exec") - - with self.assertRaisesRegex(SyntaxError, "can't assign"): - compile("{x: y for y, x in ((1, 2), (3, 4))} += 5", "", - "exec") - + # verify reference counting + if verbose and hasattr(sys, "gettotalrefcount"): + import gc + counts = [None] * 5 + for i in range(len(counts)): + support.run_doctest(test_dictcomps, verbose) + gc.collect() + counts[i] = sys.gettotalrefcount() + print(counts) if __name__ == "__main__": - unittest.main() + test_main(verbose=True) diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_gzip.py --- a/Lib/test/test_gzip.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_gzip.py Fri Jan 25 22:52:26 2013 +0100 @@ -389,20 +389,6 @@ datac = gzip.compress(data) self.assertEqual(gzip.decompress(datac), data) - def test_read_truncated(self): - data = data1*50 - # Drop the CRC (4 bytes) and file size (4 bytes). - truncated = gzip.compress(data)[:-8] - with gzip.GzipFile(fileobj=io.BytesIO(truncated)) as f: - self.assertRaises(EOFError, f.read) - with gzip.GzipFile(fileobj=io.BytesIO(truncated)) as f: - self.assertEqual(f.read(len(data)), data) - self.assertRaises(EOFError, f.read, 1) - # Incomplete 10-byte header. - for i in range(2, 10): - with gzip.GzipFile(fileobj=io.BytesIO(truncated[:i])) as f: - self.assertRaises(EOFError, f.read, 1) - class TestOpen(BaseTest): def test_binary_modes(self): diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_itertools.py --- a/Lib/test/test_itertools.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_itertools.py Fri Jan 25 22:52:26 2013 +0100 @@ -1267,14 +1267,6 @@ self.pickletest(a, compare=ans) self.pickletest(b, compare=ans) - # Issue 13454: Crash when deleting backward iterator from tee() - def test_tee_del_backward(self): - forward, backward = tee(range(20000000)) - for i in forward: - pass - - del backward - def test_StopIteration(self): self.assertRaises(StopIteration, next, zip()) diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_lzma.py --- a/Lib/test/test_lzma.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_lzma.py Fri Jan 25 22:52:26 2013 +0100 @@ -669,20 +669,6 @@ with LZMAFile(BytesIO(COMPRESSED_XZ[:128])) as f: self.assertRaises(EOFError, f.read) - def test_read_truncated(self): - # Drop stream footer: CRC (4 bytes), index size (4 bytes), - # flags (2 bytes) and magic number (2 bytes). - truncated = COMPRESSED_XZ[:-12] - with LZMAFile(BytesIO(truncated)) as f: - self.assertRaises(EOFError, f.read) - with LZMAFile(BytesIO(truncated)) as f: - self.assertEqual(f.read(len(INPUT)), INPUT) - self.assertRaises(EOFError, f.read, 1) - # Incomplete 12-byte header. - for i in range(12): - with LZMAFile(BytesIO(truncated[:i])) as f: - self.assertRaises(EOFError, f.read, 1) - def test_read_bad_args(self): f = LZMAFile(BytesIO(COMPRESSED_XZ)) f.close() diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_os.py --- a/Lib/test/test_os.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_os.py Fri Jan 25 22:52:26 2013 +0100 @@ -49,9 +49,6 @@ else: USING_LINUXTHREADS = False -# Issue #14110: Some tests fail on FreeBSD if the user is in the wheel group. -HAVE_WHEEL_GROUP = sys.platform.startswith('freebsd') and os.getgid() == 0 - # Tests creating TESTFN class FileTests(unittest.TestCase): def setUp(self): @@ -1243,7 +1240,7 @@ if hasattr(os, 'setgid'): def test_setgid(self): - if os.getuid() != 0 and not HAVE_WHEEL_GROUP: + if os.getuid() != 0: self.assertRaises(OSError, os.setgid, 0) self.assertRaises(OverflowError, os.setgid, 1<<32) @@ -1255,7 +1252,7 @@ if hasattr(os, 'setegid'): def test_setegid(self): - if os.getuid() != 0 and not HAVE_WHEEL_GROUP: + if os.getuid() != 0: self.assertRaises(OSError, os.setegid, 0) self.assertRaises(OverflowError, os.setegid, 1<<32) @@ -1275,7 +1272,7 @@ if hasattr(os, 'setregid'): def test_setregid(self): - if os.getuid() != 0 and not HAVE_WHEEL_GROUP: + if os.getuid() != 0: self.assertRaises(OSError, os.setregid, 0, 0) self.assertRaises(OverflowError, os.setregid, 1<<32, 0) self.assertRaises(OverflowError, os.setregid, 0, 1<<32) @@ -2204,6 +2201,91 @@ else: self.fail("No exception thrown by {}".format(func)) + +@unittest.skipUnless(hasattr(os, 'get_cloexec'), "need os.get_cloexec()") +class CloexecTests(unittest.TestCase): + def create_testfile(self): + fileobj = open(support.TESTFN, 'xb', cloexec=False) + self.addCleanup(support.unlink, support.TESTFN) + fileobj.close() + + def test_get_cloexec(self): + self.create_testfile() + + for cloexec in (False, True): + fd = os.open(support.TESTFN, os.O_RDONLY, cloexec=cloexec) + self.assertEqual(os.get_cloexec(fd), cloexec) + os.close(fd) + + def test_set_cloexec(self): + self.create_testfile() + + for cloexec in (False, True): + fd = os.open(support.TESTFN, os.O_RDONLY, cloexec=not cloexec) + os.set_cloexec(fd, cloexec) + self.assertEqual(os.get_cloexec(fd), cloexec) + os.close(fd) + + def test_open(self): + self.create_testfile() + + for cloexec in (None, False, True): + fd = os.open(support.TESTFN, os.O_RDONLY, cloexec=cloexec) + if cloexec is None: + cloexec = sys.getdefaultcloexec() + self.assertEqual(os.get_cloexec(fd), cloexec) + os.close(fd) + + @unittest.skipUnless(hasattr(os, 'pipe'), "need os.pipe()") + def test_pipe_cloexec(self): + for cloexec in (None, False, True): + rfd, wfd = os.pipe(cloexec=cloexec) + if cloexec is None: + cloexec = sys.getdefaultcloexec() + self.assertEqual(os.get_cloexec(rfd), cloexec) + self.assertEqual(os.get_cloexec(wfd), cloexec) + os.close(rfd) + os.close(wfd) + + @unittest.skipUnless(hasattr(os, 'dup'), "need os.dup()") + def test_dup_cloexec(self): + self.create_testfile() + + for cloexec in (None, False, True): + fd1 = os.open(support.TESTFN, os.O_RDONLY, cloexec=not cloexec) + fd2 = os.dup(fd1, cloexec=cloexec) + if cloexec is None: + cloexec = sys.getdefaultcloexec() + self.assertEqual(os.get_cloexec(fd2), cloexec) + os.close(fd1) + os.close(fd2) + + @unittest.skipUnless(hasattr(os, 'dup2'), "need os.dup2()") + def test_dup2_cloexec(self): + self.create_testfile() + + for cloexec in (None, False, True): + fd1 = os.open(support.TESTFN, os.O_RDONLY, cloexec=not cloexec) + fd2 = os.open(support.TESTFN, os.O_RDONLY, cloexec=not cloexec) + os.dup2(fd1, fd2, cloexec=cloexec) + if cloexec is None: + cloexec = sys.getdefaultcloexec() + self.assertEqual(os.get_cloexec(fd2), cloexec) + os.close(fd1) + os.close(fd2) + + @unittest.skipUnless(hasattr(os, 'openpty'), "need os.openpty()") + def test_openpty_cloexec(self): + for cloexec in (None, False, True): + master_fd, slave_fd = os.openpty(cloexec=cloexec) + if cloexec is None: + cloexec = sys.getdefaultcloexec() + self.assertEqual(os.get_cloexec(master_fd), cloexec) + self.assertEqual(os.get_cloexec(slave_fd), cloexec) + os.close(master_fd) + os.close(slave_fd) + + @support.reap_threads def test_main(): support.run_unittest( @@ -2234,6 +2316,7 @@ TermsizeTests, OSErrorTests, RemoveDirsTests, + CloexecTests, ) if __name__ == "__main__": diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_shutil.py --- a/Lib/test/test_shutil.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_shutil.py Fri Jan 25 22:52:26 2013 +0100 @@ -1280,13 +1280,12 @@ class TestWhich(unittest.TestCase): def setUp(self): - self.temp_dir = tempfile.mkdtemp(prefix="Tmp") + self.temp_dir = tempfile.mkdtemp() self.addCleanup(shutil.rmtree, self.temp_dir, True) # Give the temp_file an ".exe" suffix for all. # It's needed on Windows and not harmful on other platforms. self.temp_file = tempfile.NamedTemporaryFile(dir=self.temp_dir, - prefix="Tmp", - suffix=".Exe") + suffix=".exe") os.chmod(self.temp_file.name, stat.S_IXUSR) self.addCleanup(self.temp_file.close) self.dir, self.file = os.path.split(self.temp_file.name) @@ -1296,36 +1295,11 @@ rv = shutil.which(self.file, path=self.dir) self.assertEqual(rv, self.temp_file.name) - def test_absolute_cmd(self): + def test_full_path_short_circuit(self): # When given the fully qualified path to an executable that exists, # it should be returned. rv = shutil.which(self.temp_file.name, path=self.temp_dir) - self.assertEqual(rv, self.temp_file.name) - - def test_relative_cmd(self): - # When given the relative path with a directory part to an executable - # that exists, it should be returned. - base_dir, tail_dir = os.path.split(self.dir) - relpath = os.path.join(tail_dir, self.file) - with support.temp_cwd(path=base_dir): - rv = shutil.which(relpath, path=self.temp_dir) - self.assertEqual(rv, relpath) - # But it shouldn't be searched in PATH directories (issue #16957). - with support.temp_cwd(path=self.dir): - rv = shutil.which(relpath, path=base_dir) - self.assertIsNone(rv) - - def test_cwd(self): - # Issue #16957 - base_dir = os.path.dirname(self.dir) - with support.temp_cwd(path=self.dir): - rv = shutil.which(self.file, path=base_dir) - if sys.platform == "win32": - # Windows: current directory implicitly on PATH - self.assertEqual(rv, os.path.join(os.curdir, self.file)) - else: - # Other platforms: shouldn't match in the current directory. - self.assertIsNone(rv) + self.assertEqual(self.temp_file.name, rv) def test_non_matching_mode(self): # Set the file read-only and ask for writeable files. @@ -1333,11 +1307,15 @@ rv = shutil.which(self.file, path=self.dir, mode=os.W_OK) self.assertIsNone(rv) - def test_relative_path(self): + def test_relative(self): + old_cwd = os.getcwd() base_dir, tail_dir = os.path.split(self.dir) - with support.temp_cwd(path=base_dir): + os.chdir(base_dir) + try: rv = shutil.which(self.file, path=tail_dir) self.assertEqual(rv, os.path.join(tail_dir, self.file)) + finally: + os.chdir(old_cwd) def test_nonexistent_file(self): # Return None when no matching executable file is found on the path. @@ -1349,8 +1327,8 @@ def test_pathext_checking(self): # Ask for the file without the ".exe" extension, then ensure that # it gets found properly with the extension. - rv = shutil.which(self.file[:-4], path=self.dir) - self.assertEqual(rv, self.temp_file.name[:-4] + ".EXE") + rv = shutil.which(self.temp_file.name[:-4], path=self.dir) + self.assertEqual(self.temp_file.name, rv) class TestMove(unittest.TestCase): @@ -1549,7 +1527,7 @@ self._delete = True def test_w_source_open_fails(self): - def _open(filename, mode='r'): + def _open(filename, mode='r', cloexec=True): if filename == 'srcfile': raise OSError('Cannot open "srcfile"') assert 0 # shouldn't reach here. @@ -1562,7 +1540,7 @@ srcfile = self.Faux() - def _open(filename, mode='r'): + def _open(filename, mode='r', cloexec=True): if filename == 'srcfile': return srcfile if filename == 'destfile': @@ -1582,7 +1560,7 @@ srcfile = self.Faux() destfile = self.Faux(True) - def _open(filename, mode='r'): + def _open(filename, mode='r', cloexec=True): if filename == 'srcfile': return srcfile if filename == 'destfile': @@ -1604,7 +1582,7 @@ srcfile = self.Faux(True) destfile = self.Faux() - def _open(filename, mode='r'): + def _open(filename, mode='r', cloexec=True): if filename == 'srcfile': return srcfile if filename == 'destfile': diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_signal.py --- a/Lib/test/test_signal.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_signal.py Fri Jan 25 22:52:26 2013 +0100 @@ -219,13 +219,6 @@ signal.signal(7, handler) -class WakeupFDTests(unittest.TestCase): - - def test_invalid_fd(self): - fd = support.make_bad_fd() - self.assertRaises(ValueError, signal.set_wakeup_fd, fd) - - @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") class WakeupSignalTests(unittest.TestCase): def check_wakeup(self, test_body, *signals, ordered=True): @@ -868,8 +861,8 @@ def test_main(): try: support.run_unittest(PosixTests, InterProcessSignalTests, - WakeupFDTests, WakeupSignalTests, - SiginterruptTest, ItimerTest, WindowsSignalTests, + WakeupSignalTests, SiginterruptTest, + ItimerTest, WindowsSignalTests, PendingSignalsTests) finally: support.reap_children() diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_socket.py --- a/Lib/test/test_socket.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_socket.py Fri Jan 25 22:52:26 2013 +0100 @@ -24,10 +24,6 @@ import pickle import struct try: - import fcntl -except ImportError: - fcntl = False -try: import multiprocessing except ImportError: multiprocessing = False @@ -1073,7 +1069,7 @@ def testNewAttributes(self): # testing .family, .type and .protocol - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, cloexec=False) self.assertEqual(sock.family, socket.AF_INET) self.assertEqual(sock.type, socket.SOCK_STREAM) self.assertEqual(sock.proto, 0) @@ -4653,16 +4649,37 @@ self.assertRaises(OSError, sock.sendall, b'foo') -@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"), - "SOCK_CLOEXEC not defined") -@unittest.skipUnless(fcntl, "module fcntl not available") -class CloexecConstantTest(unittest.TestCase): +@unittest.skipUnless(hasattr(os, 'get_cloexec'), "need os.get_cloexec()") +class CloexecTest(unittest.TestCase): + @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"), + "SOCK_CLOEXEC not defined") @support.requires_linux_version(2, 6, 28) def test_SOCK_CLOEXEC(self): with socket.socket(socket.AF_INET, socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s: self.assertTrue(s.type & socket.SOCK_CLOEXEC) - self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC) + self.assertTrue(os.get_cloexec(sock.fileno())) + + def test_socket_cloexec(self): + for cloexec in (None, False, True): + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, + cloexec=cloexec) + if cloexec is None: + cloexec = sys.getdefaultcloexec() + with sock: + self.assertEqual(os.get_cloexec(sock.fileno()), cloexec) + + @unittest.skipUnless(hasattr(socket, "socketpair"), + "need socket.socketpair()") + def test_socketpair_cloexec(self): + for cloexec in (None, False, True): + s1, s2 = socket.socketpair(cloexec=cloexec) + if cloexec is None: + cloexec = sys.getdefaultcloexec() + self.assertEqual(os.get_cloexec(s1.fileno()), cloexec) + self.assertEqual(os.get_cloexec(s2.fileno()), cloexec) + s1.close() + s2.close() @unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"), @@ -4831,7 +4848,7 @@ NetworkConnectionAttributesTest, NetworkConnectionBehaviourTest, ContextManagersTest, - CloexecConstantTest, + CloexecTest, NonblockConstantTest ]) if hasattr(socket, "socketpair"): diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_subprocess.py --- a/Lib/test/test_subprocess.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_subprocess.py Fri Jan 25 22:52:26 2013 +0100 @@ -1438,7 +1438,7 @@ self.assertEqual((out, err), (b'apple', b'orange')) finally: for b, a in zip(newfds, fds): - os.dup2(b, a) + os.dup2(b, a, cloexec=False) for b in newfds: os.close(b) @@ -1498,7 +1498,7 @@ finally: # restore the original fd's underneath sys.stdin, etc. for std, saved in enumerate(saved_fds): - os.dup2(saved, std) + os.dup2(saved, std, cloexec=False) os.close(saved) for fd in temp_fds: @@ -1550,7 +1550,7 @@ err = support.strip_python_stderr(os.read(stderr_no, 1024)) finally: for std, saved in enumerate(saved_fds): - os.dup2(saved, std) + os.dup2(saved, std, cloexec=False) os.close(saved) self.assertEqual(out, b"got STDIN") @@ -1711,14 +1711,14 @@ def test_close_fds(self): fd_status = support.findfile("fd_status.py", subdir="subprocessdata") - fds = os.pipe() + fds = os.pipe(cloexec=False) self.addCleanup(os.close, fds[0]) self.addCleanup(os.close, fds[1]) open_fds = set(fds) # add a bunch more fds for _ in range(9): - fd = os.open("/dev/null", os.O_RDONLY) + fd = os.open("/dev/null", os.O_RDONLY, cloexec=False) self.addCleanup(os.close, fd) open_fds.add(fd) @@ -1763,7 +1763,7 @@ open_fds = set() for x in range(5): - fds = os.pipe() + fds = os.pipe(cloexec=False) self.addCleanup(os.close, fds[0]) self.addCleanup(os.close, fds[1]) open_fds.update(fds) diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_sys.py --- a/Lib/test/test_sys.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_sys.py Fri Jan 25 22:52:26 2013 +0100 @@ -8,6 +8,7 @@ import codecs import gc import sysconfig +from test.script_helper import assert_python_ok # count the number of test runs, used to create unique # strings to intern in test_intern() @@ -608,7 +609,6 @@ def test_debugmallocstats(self): # Test sys._debugmallocstats() - from test.script_helper import assert_python_ok args = ['-c', 'import sys; sys._debugmallocstats()'] ret, out, err = assert_python_ok(*args) self.assertIn(b"free PyDictObjects", err) @@ -642,6 +642,30 @@ c = sys.getallocatedblocks() self.assertIn(c, range(b - 50, b + 50)) + def test_getdefaultcloexec_cmdline(self): + code = 'import sys; print(sys.getdefaultcloexec())' + + ok, stdout, stderr = assert_python_ok('-c', code) + self.assertEqual(stdout.rstrip(), b'False') + + ok, stdout, stderr = assert_python_ok('-c', code, PYTHONCLOEXEC='1') + self.assertEqual(stdout.rstrip(), b'True') + + ok, stdout, stderr = assert_python_ok('-E', '-c', code, PYTHONCLOEXEC='1') + self.assertEqual(stdout.rstrip(), b'False') + + ok, stdout, stderr = assert_python_ok('-e', '-c', code) + self.assertEqual(stdout.rstrip(), b'True') + + def test_setdefaultcloexec(self): + code = '\n'.join(( + 'import sys', + 'sys.setdefaultcloexec()', + 'print(sys.getdefaultcloexec())', + )) + ok, stdout, stderr = assert_python_ok('-c', code) + self.assertEqual(stdout.rstrip(), b'True') + class SizeofTest(unittest.TestCase): diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_threading.py --- a/Lib/test/test_threading.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_threading.py Fri Jan 25 22:52:26 2013 +0100 @@ -451,8 +451,7 @@ # #12316 and #11870), and fork() from a worker thread is known to trigger # problems with some operating systems (issue #3863): skip problematic tests # on platforms known to behave badly. - platforms_to_skip = ('freebsd4', 'freebsd5', 'freebsd6', 'netbsd5', - 'hp-ux11') + platforms_to_skip = ('freebsd4', 'freebsd5', 'freebsd6', 'netbsd5') def _run_and_join(self, script): script = """if 1: diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_ucn.py --- a/Lib/test/test_ucn.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_ucn.py Fri Jan 25 22:52:26 2013 +0100 @@ -9,7 +9,6 @@ import unittest import unicodedata -import _testcapi from test import support from http.client import HTTPException @@ -216,21 +215,6 @@ str, b"\\NSPACE", 'unicode-escape', 'strict' ) - @unittest.skipUnless(_testcapi.INT_MAX < _testcapi.PY_SSIZE_T_MAX, - "needs UINT_MAX < SIZE_MAX") - @support.bigmemtest(size=_testcapi.UINT_MAX + 1, - memuse=2 + 1, dry_run=False) - def test_issue16335(self, size): - # very very long bogus character name - x = b'\\N{SPACE' + b'x' * (_testcapi.UINT_MAX + 1) + b'}' - self.assertEqual(len(x), len(b'\\N{SPACE}') + - (_testcapi.UINT_MAX + 1)) - self.assertRaisesRegex(UnicodeError, - 'unknown Unicode character name', - x.decode, 'unicode-escape' - ) - - def test_main(): support.run_unittest(UnicodeNamesTest) diff -r d8c2ce63f5a4 -r 297b3529876a Lib/test/test_xml_etree.py --- a/Lib/test/test_xml_etree.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/test/test_xml_etree.py Fri Jan 25 22:52:26 2013 +0100 @@ -1776,28 +1776,6 @@ # Issue #16922 self.assertEqual(ET.XML('').findtext('empty'), '') - def test_find_xpath(self): - LINEAR_XML = ''' - - - - - - ''' - e = ET.XML(LINEAR_XML) - - # Test for numeric indexing and last() - self.assertEqual(e.find('./tag[1]').attrib['class'], 'a') - self.assertEqual(e.find('./tag[2]').attrib['class'], 'b') - self.assertEqual(e.find('./tag[last()]').attrib['class'], 'd') - self.assertEqual(e.find('./tag[last()-1]').attrib['class'], 'c') - self.assertEqual(e.find('./tag[last()-2]').attrib['class'], 'b') - - self.assertRaisesRegex(SyntaxError, 'XPath', e.find, './tag[0]') - self.assertRaisesRegex(SyntaxError, 'XPath', e.find, './tag[-1]') - self.assertRaisesRegex(SyntaxError, 'XPath', e.find, './tag[last()-0]') - self.assertRaisesRegex(SyntaxError, 'XPath', e.find, './tag[last()+1]') - def test_findall(self): e = ET.XML(SAMPLE_XML) e[2] = ET.XML(SAMPLE_SECTION) @@ -1886,12 +1864,6 @@ sourcefile = serialize(doc, to_string=False) self.assertEqual(next(ET.iterparse(sourcefile))[0], 'end') - # With an explitit parser too (issue #9708) - sourcefile = serialize(doc, to_string=False) - parser = ET.XMLParser(target=ET.TreeBuilder()) - self.assertEqual(next(ET.iterparse(sourcefile, parser=parser))[0], - 'end') - tree = ET.ElementTree(None) self.assertRaises(AttributeError, tree.iter) diff -r d8c2ce63f5a4 -r 297b3529876a Lib/urllib/request.py --- a/Lib/urllib/request.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/urllib/request.py Fri Jan 25 22:52:26 2013 +0100 @@ -193,7 +193,7 @@ # Handle temporary file setup. if filename: - tfp = open(filename, 'wb') + tfp = open(filename, 'wb', cloexec=True) else: tfp = tempfile.NamedTemporaryFile(delete=False) filename = tfp.name @@ -1443,7 +1443,7 @@ origurl = 'file://' + host + filename else: origurl = 'file://' + filename - return addinfourl(open(localfile, 'rb'), headers, origurl) + return addinfourl(open(localfile, 'rb', cloexec=True), headers, origurl) except OSError as exp: # users shouldn't expect OSErrors coming from urlopen() raise URLError(exp) @@ -1694,7 +1694,7 @@ fullurl = quote(fullurl, safe="%/:=&?~#+!$,;'@()*[]|") if self.tempcache and fullurl in self.tempcache: filename, headers = self.tempcache[fullurl] - fp = open(filename, 'rb') + fp = open(filename, 'rb', cloexec=True) return addinfourl(fp, headers, fullurl) urltype, url = splittype(fullurl) if not urltype: @@ -1754,7 +1754,7 @@ try: headers = fp.info() if filename: - tfp = open(filename, 'wb') + tfp = open(filename, 'wb', cloexec=True) else: import tempfile garbage, path = splittype(url) @@ -1764,7 +1764,7 @@ suffix = os.path.splitext(path)[1] (fd, filename) = tempfile.mkstemp(suffix) self.__tempfiles.append(filename) - tfp = os.fdopen(fd, 'wb') + tfp = os.fdopen(fd, 'wb', cloexec=False) try: result = filename, headers if self.tempcache is not None: @@ -1957,7 +1957,7 @@ urlfile = file if file[:1] == '/': urlfile = 'file://' + file - return addinfourl(open(localname, 'rb'), headers, urlfile) + return addinfourl(open(localname, 'rb', cloexec=True), headers, urlfile) host, port = splitport(host) if (not port and socket.gethostbyname(host) in ((localhost(),) + thishost())): @@ -1966,7 +1966,7 @@ urlfile = 'file://' + file elif file[:2] == './': raise ValueError("local file url may start with / or file:. Unknown url of type: %s" % url) - return addinfourl(open(localname, 'rb'), headers, urlfile) + return addinfourl(open(localname, 'rb', cloexec=True), headers, urlfile) raise URLError('local file error: not on local host') def open_ftp(self, url): diff -r d8c2ce63f5a4 -r 297b3529876a Lib/venv/__init__.py --- a/Lib/venv/__init__.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/venv/__init__.py Fri Jan 25 22:52:26 2013 +0100 @@ -157,7 +157,7 @@ being processed. """ context.cfg_path = path = os.path.join(context.env_dir, 'pyvenv.cfg') - with open(path, 'w', encoding='utf-8') as f: + with open(path, 'w', encoding='utf-8', cloexec=True) as f: f.write('home = %s\n' % context.python_dir) if self.system_site_packages: incl = 'true' @@ -309,7 +309,7 @@ if not os.path.exists(dstdir): os.makedirs(dstdir) dstfile = os.path.join(dstdir, f) - with open(srcfile, 'rb') as f: + with open(srcfile, 'rb', cloexec=True) as f: data = f.read() if srcfile.endswith('.exe'): mode = 'wb' @@ -323,7 +323,7 @@ logger.warning('unable to copy script %r, ' 'may be binary: %s', srcfile, e) if data is not None: - with open(dstfile, mode) as f: + with open(dstfile, mode, cloexec=True) as f: f.write(data) shutil.copymode(srcfile, dstfile) diff -r d8c2ce63f5a4 -r 297b3529876a Lib/xml/dom/minidom.py --- a/Lib/xml/dom/minidom.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/xml/dom/minidom.py Fri Jan 25 22:52:26 2013 +0100 @@ -1,6 +1,5 @@ -"""Simple implementation of the Level 1 DOM. - -Namespaces and other minor Level 2 features are also supported. +"""\ +minidom.py -- a lightweight DOM implementation. parse("foo.xml") diff -r d8c2ce63f5a4 -r 297b3529876a Lib/xml/etree/ElementPath.py --- a/Lib/xml/etree/ElementPath.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/xml/etree/ElementPath.py Fri Jan 25 22:52:26 2013 +0100 @@ -174,7 +174,7 @@ if elem.get(key) == value: yield elem return select - if signature == "-" and not re.match("\-?\d+$", predicate[0]): + if signature == "-" and not re.match("\d+$", predicate[0]): # [tag] tag = predicate[0] def select(context, result): @@ -182,7 +182,7 @@ if elem.find(tag) is not None: yield elem return select - if signature == "-='" and not re.match("\-?\d+$", predicate[0]): + if signature == "-='" and not re.match("\d+$", predicate[0]): # [tag='value'] tag = predicate[0] value = predicate[-1] @@ -196,10 +196,7 @@ if signature == "-" or signature == "-()" or signature == "-()-": # [index] or [last()] or [last()-index] if signature == "-": - # [index] index = int(predicate[0]) - 1 - if index < 0: - raise SyntaxError("XPath position >= 1 expected") else: if predicate[0] != "last": raise SyntaxError("unsupported function") @@ -208,8 +205,6 @@ index = int(predicate[2]) - 1 except ValueError: raise SyntaxError("unsupported expression") - if index > -2: - raise SyntaxError("XPath offset from last() must be negative") else: index = -1 def select(context, result): diff -r d8c2ce63f5a4 -r 297b3529876a Lib/xml/etree/ElementTree.py --- a/Lib/xml/etree/ElementTree.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/xml/etree/ElementTree.py Fri Jan 25 22:52:26 2013 +0100 @@ -1743,20 +1743,8 @@ source.close() class iterparse: - """Parses an XML section into an element tree incrementally. - - Reports what’s going on to the user. 'source' is a filename or file - object containing XML data. 'events' is a list 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. - 'parser' is an optional parser instance. If not given, the standard - XMLParser parser is used. Returns an iterator providing - (event, elem) pairs. - """ - root = None - def __init__(self, file, events=None, parser=None): + def __init__(self, file, events=None): self._close_file = False if not hasattr(file, 'read'): file = open(file, 'rb') @@ -1766,9 +1754,8 @@ self._index = 0 self._error = None self.root = self._root = None - if parser is None: - parser = XMLParser(target=TreeBuilder()) - self._parser = parser + b = TreeBuilder() + self._parser = XMLParser(b) self._parser._setevents(self._events, events) def __next__(self): diff -r d8c2ce63f5a4 -r 297b3529876a Lib/xmlrpc/server.py --- a/Lib/xmlrpc/server.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Lib/xmlrpc/server.py Fri Jan 25 22:52:26 2013 +0100 @@ -587,10 +587,8 @@ # [Bug #1222790] If possible, set close-on-exec flag; if a # method spawns a subprocess, the subprocess shouldn't have # the listening socket open. - if fcntl is not None and hasattr(fcntl, 'FD_CLOEXEC'): - flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD) - flags |= fcntl.FD_CLOEXEC - fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags) + if hasattr(os, 'set_cloexec'): + os.set_cloexec(self.fileno()) class MultiPathXMLRPCServer(SimpleXMLRPCServer): """Multipath XML-RPC Server diff -r d8c2ce63f5a4 -r 297b3529876a Makefile.pre.in --- a/Makefile.pre.in Fri Jan 25 23:53:29 2013 +0200 +++ b/Makefile.pre.in Fri Jan 25 22:52:26 2013 +0100 @@ -97,9 +97,6 @@ # Machine-dependent subdirectories MACHDEP= @MACHDEP@ -# Multiarch directory (may be empty) -MULTIARCH= @MULTIARCH@ - # Install prefix for architecture-independent files prefix= @prefix@ @@ -203,8 +200,7 @@ PYTHON_FOR_BUILD=@PYTHON_FOR_BUILD@ _PYTHON_HOST_PLATFORM=@_PYTHON_HOST_PLATFORM@ -BUILD_GNU_TYPE= @build@ -HOST_GNU_TYPE= @host@ +HOST_GNU_TYPE= @host@ # 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 @@ -1123,13 +1119,6 @@ export PYTHONPATH; PYTHONPATH="`pwd`/Lib"; \ export DYLD_FRAMEWORK_PATH; DYLD_FRAMEWORK_PATH="`pwd`"; \ export EXE; EXE="$(BUILDEXE)"; \ - if [ -n "$(MULTIARCH)" ]; then export MULTIARCH; MULTIARCH=$(MULTIARCH); fi; \ - export PYTHON_FOR_BUILD; \ - if [ "$(BUILD_GNU_TYPE)" = "$(HOST_GNU_TYPE)" ]; then \ - PYTHON_FOR_BUILD="$(BUILDPYTHON)"; \ - else \ - PYTHON_FOR_BUILD="$(PYTHON_FOR_BUILD)"; \ - fi; \ cd $(srcdir)/Lib/$(PLATDIR); $(RUNSHARED) ./regen python-config: $(srcdir)/Misc/python-config.in diff -r d8c2ce63f5a4 -r 297b3529876a Misc/ACKS --- a/Misc/ACKS Fri Jan 25 23:53:29 2013 +0200 +++ b/Misc/ACKS Fri Jan 25 22:52:26 2013 +0100 @@ -45,7 +45,6 @@ Heidi Annexstad Éric Araujo Alicia Arlen -Jeffrey Armstrong Jason Asbahr David Ascher Chris AtLee diff -r d8c2ce63f5a4 -r 297b3529876a Misc/NEWS --- a/Misc/NEWS Fri Jan 25 23:53:29 2013 +0200 +++ b/Misc/NEWS Fri Jan 25 22:52:26 2013 +0100 @@ -10,12 +10,7 @@ Core and Builtins ----------------- -- Issue #16980: Fix processing of escaped non-ascii bytes in the - unicode-escape-decode decoder. - -- Issue #16975: Fix error handling bug in the escape-decode bytes decoder. - -- Issue #14850: Now a charmap decoder treats U+FFFE as "undefined mapping" +- Issue #14850: Now a chamap decoder treates U+FFFE as "undefined mapping" in any mapping, not only in a string. - Issue #16730: importlib.machinery.FileFinder now no longers raises an @@ -39,7 +34,7 @@ - Issue #16761: Calling int() with base argument only now raises TypeError. - Issue #16759: Support the full DWORD (unsigned long) range in Reg2Py - when retrieving a REG_DWORD value. This corrects functions like + when retreiving a REG_DWORD value. This corrects functions like winreg.QueryValueEx that may have been returning truncated values. - Issue #14420: Support the full DWORD (unsigned long) range in Py2Reg @@ -55,6 +50,8 @@ - Issue #15422: Get rid of PyCFunction_New macro. Use PyCFunction_NewEx function (PyCFunction_New func is still present for backward compatibility). +- Issue #16672: Improve performance tracing performance + - Issue #14470: Remove w9xpopen support per PEP 11. - Issue #9856: Replace deprecation warning with raising TypeError @@ -223,34 +220,6 @@ Library ------- -- Issue #180022: Have site.addpackage() consider already known paths even when - none are explicitly passed in. Bug report and fix by Kirill. - -- Issue #1602133: on Mac OS X a shared library build (``--enable-shared``) - now fills the ``os.environ`` variable correctly. - -- Issue #9290: In IDLE the sys.std* streams now implement io.TextIOBase - interface and support all mandatory methods and properties. - -- Issue #13454: Fix a crash when deleting an iterator created by itertools.tee() - if all other iterators were very advanced before. - -- Issue #12411: Fix to cgi.parse_multipart to correctly use bytes boundaries - and bytes data. Patch by Jonas Wagner. - -- Issue #16957: shutil.which() no longer searches a bare file name in the - current directory on Unix and no longer searches a relative file path with - a directory part in PATH directories. Patch by Thomas Kluyver. - -- Issue #1159051: GzipFile now raises EOFError when reading a corrupted file - with truncated header or footer. - -- Issue #16993: shutil.which() now preserves the case of the path and extension - on Windows. - -- Issue #16992: On Windows in signal.set_wakeup_fd, validate the file - descriptor argument. - - Issue #16422: For compatibility with the Python version, the C version of decimal now uses strings instead of integers for rounding mode constants. @@ -760,20 +729,6 @@ Build ----- -- Issue #17031: Fix running regen in cross builds. - -- Issue #3754: fix typo in pthread AC_CACHE_VAL. - -- Issue #15484: Fix _PYTHON_PROJECT_BASE for srcdir != builddir builds; - use _PYTHON_PROJECT_BASE in distutils/sysconfig.py. - -- Drop support for Windows 2000. - -- Issue #17029: Let h2py search the multiarch system include directory. - -- Issue #16953: Fix socket module compilation on platforms with - HAVE_BROKEN_POLL. Patch by Jeffrey Armstrong. - - Issue #16320: Remove redundant Makefile dependencies for strings and bytes. - Cross compiling needs host and build settings. configure no longer @@ -1658,7 +1613,7 @@ - Issue #14626: Large refactoring of functions / parameters in the os module. Many functions now support "dir_fd" and "follow_symlinks" parameters; - some also support accepting an open file descriptor in place of a path + some also support accepting an open file descriptor in place of of a path string. Added os.support_* collections as LBYL helpers. Removed many functions only previously seen in 3.3 alpha releases (often starting with "f" or "l", or ending with "at"). Originally suggested by Serhiy Storchaka; @@ -2292,7 +2247,7 @@ - Issue #14399: zipfile now recognizes that the archive has been modified even if only the comment is changed. In addition, the TypeError that results from - trying to set a non-binary value as a comment is now raised at the time + trying to set a non-binary value as a comment is now now raised at the time the comment is set rather than at the time the zipfile is written. - trace.CoverageResults.is_ignored_filename() now ignores any name that starts @@ -3932,7 +3887,7 @@ check or set the MACOSX_DEPLOYMENT_TARGET environment variable for the interpreter process. This could cause failures in non-Distutils subprocesses and was unreliable since tests or user programs could modify the interpreter - environment after Distutils set it. Instead, have Distutils set the + environment after Distutils set it. Instead, have Distutils set the the deployment target only in the environment of each build subprocess. It is still possible to globally override the default by setting MACOSX_DEPLOYMENT_TARGET before launching the interpreter; its value must be diff -r d8c2ce63f5a4 -r 297b3529876a Modules/_ctypes/libffi/configure --- a/Modules/_ctypes/libffi/configure Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/_ctypes/libffi/configure Fri Jan 25 22:52:26 2013 +0100 @@ -14322,10 +14322,10 @@ $as_echo_n "(cached) " >&6 else - libffi_cv_as_x86_pcrel=no + libffi_cv_as_x86_pcrel=yes echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s - if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then - libffi_cv_as_x86_pcrel=yes + if $CC $CFLAGS -c conftest.s 2>&1 | $EGREP -i 'illegal|warning' > /dev/null; then + libffi_cv_as_x86_pcrel=no fi fi diff -r d8c2ce63f5a4 -r 297b3529876a Modules/_ctypes/libffi/configure.ac --- a/Modules/_ctypes/libffi/configure.ac Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/_ctypes/libffi/configure.ac Fri Jan 25 22:52:26 2013 +0100 @@ -303,10 +303,10 @@ if test x$TARGET = xX86 || test x$TARGET = xX86_WIN32 || test x$TARGET = xX86_64; then AC_CACHE_CHECK([assembler supports pc related relocs], libffi_cv_as_x86_pcrel, [ - libffi_cv_as_x86_pcrel=no + libffi_cv_as_x86_pcrel=yes echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s - if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; then - libffi_cv_as_x86_pcrel=yes + if $CC $CFLAGS -c conftest.s 2>&1 | $EGREP -i 'illegal|warning' > /dev/null; then + libffi_cv_as_x86_pcrel=no fi ]) if test "x$libffi_cv_as_x86_pcrel" = xyes; then diff -r d8c2ce63f5a4 -r 297b3529876a Modules/_cursesmodule.c --- a/Modules/_cursesmodule.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/_cursesmodule.c Fri Jan 25 22:52:26 2013 +0100 @@ -1701,6 +1701,7 @@ fd = mkstemp(fn); if (fd < 0) return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn); + _Py_try_set_cloexec(fd, 1); fp = fdopen(fd, "wb+"); if (fp == NULL) { close(fd); @@ -2264,6 +2265,7 @@ fd = mkstemp(fn); if (fd < 0) return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn); + _Py_try_set_cloexec(fd, 1); fp = fdopen(fd, "wb+"); if (fp == NULL) { close(fd); diff -r d8c2ce63f5a4 -r 297b3529876a Modules/_decimal/_decimal.c --- a/Modules/_decimal/_decimal.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/_decimal/_decimal.c Fri Jan 25 22:52:26 2013 +0100 @@ -3222,13 +3222,7 @@ decstring = mpd_qformat_spec(MPD(dec), &spec, CTX(context), &status); if (decstring == NULL) { - if (status & MPD_Malloc_error) { - PyErr_NoMemory(); - } - else { - PyErr_SetString(PyExc_ValueError, - "format specification exceeds internal limits of _decimal"); - } + dec_addstatus(context, status); goto finish; } result = PyUnicode_DecodeUTF8(decstring, strlen(decstring), NULL); diff -r d8c2ce63f5a4 -r 297b3529876a Modules/_freeze_importlib.c --- a/Modules/_freeze_importlib.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/_freeze_importlib.c Fri Jan 25 22:52:26 2013 +0100 @@ -12,6 +12,10 @@ #include #endif +#ifdef HAVE_FCNTL_H +#include +#endif /* HAVE_FCNTL_H */ + /* To avoid a circular dependency on frozen.o, we create our own structure of frozen modules instead, left deliberately blank so as to avoid @@ -33,6 +37,7 @@ int main(int argc, char *argv[]) { + int fd; char *inpath, *outpath; FILE *infile, *outfile = NULL; struct stat st; @@ -49,7 +54,11 @@ } inpath = argv[1]; outpath = argv[2]; - infile = fopen(inpath, "rb"); + fd = _Py_open(inpath, O_RDWR); + if (fd >= 0) + infile = fdopen(fd, "rb"); + else + infile = NULL; if (infile == NULL) { fprintf(stderr, "cannot open '%s' for reading\n", inpath); return 1; @@ -99,7 +108,11 @@ /* Open the file in text mode. The hg checkout should be using the eol extension, which in turn should cause the EOL style match the C library's text mode */ - outfile = fopen(outpath, "w"); + fd = _Py_open(outpath, O_WRONLY); + if (fd >= 0) + outfile = fdopen(fd, "w"); + else + outfile = NULL; if (outfile == NULL) { fprintf(stderr, "cannot open '%s' for writing\n", outpath); return 1; diff -r d8c2ce63f5a4 -r 297b3529876a Modules/_heapqmodule.c --- a/Modules/_heapqmodule.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/_heapqmodule.c Fri Jan 25 22:52:26 2013 +0100 @@ -118,7 +118,7 @@ } PyDoc_STRVAR(heappush_doc, -"heappush(heap, item) -> None. Push item onto heap, maintaining the heap invariant."); +"Push item onto heap, maintaining the heap invariant."); static PyObject * heappop(PyObject *self, PyObject *heap) @@ -186,7 +186,7 @@ } PyDoc_STRVAR(heapreplace_doc, -"heapreplace(heap, item) -> value. Pop and return the current smallest value, and add the new item.\n\ +"Pop and return the current smallest value, and add the new item.\n\ \n\ This is more efficient than heappop() followed by heappush(), and can be\n\ more appropriate when using a fixed-size heap. Note that the value\n\ @@ -233,7 +233,7 @@ } PyDoc_STRVAR(heappushpop_doc, -"heappushpop(heap, item) -> value. Push item on the heap, then pop and return the smallest item\n\ +"Push item on the heap, then pop and return the smallest item\n\ from the heap. The combined action runs more efficiently than\n\ heappush() followed by a separate call to heappop()."); diff -r d8c2ce63f5a4 -r 297b3529876a Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/_io/_iomodule.c Fri Jan 25 22:52:26 2013 +0100 @@ -94,8 +94,8 @@ * The main open() function */ PyDoc_STRVAR(open_doc, -"open(file, mode='r', buffering=-1, encoding=None,\n" -" errors=None, newline=None, closefd=True, opener=None) -> file object\n" +"open(file, mode='r', buffering=-1, encoding=None, errors=None,\n" +" newline=None, closefd=True, opener=None, cloexec=None) -> file object\n" "\n" "Open file and return a stream. Raise IOError upon failure.\n" "\n" @@ -199,6 +199,8 @@ "file descriptor (passing os.open as *opener* results in functionality\n" "similar to passing None).\n" "\n" +"If cloexec is True, the close-on-exec flag is set.\n" +"\n" "open() returns a file object whose type depends on the mode, and\n" "through which the standard file operations such as reading and writing\n" "are performed. When open() is used to open a file in a text mode ('w',\n" @@ -219,8 +221,9 @@ { char *kwlist[] = {"file", "mode", "buffering", "encoding", "errors", "newline", - "closefd", "opener", NULL}; + "closefd", "opener", "cloexec", NULL}; PyObject *file, *opener = Py_None; + int cloexec = Py_DefaultCloexec; char *mode = "r"; int buffering = -1, closefd = 1; char *encoding = NULL, *errors = NULL, *newline = NULL; @@ -238,10 +241,11 @@ _Py_IDENTIFIER(fileno); _Py_IDENTIFIER(mode); - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|sizzziO:open", kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|sizzziOO&:open", kwlist, &file, &mode, &buffering, &encoding, &errors, &newline, - &closefd, &opener)) { + &closefd, &opener, + _Py_cloexec_converter, &cloexec)) { return NULL; } @@ -345,7 +349,7 @@ /* Create the Raw file stream */ raw = PyObject_CallFunction((PyObject *)&PyFileIO_Type, - "OsiO", file, rawmode, closefd, opener); + "OsiOi", file, rawmode, closefd, opener, cloexec); if (raw == NULL) return NULL; diff -r d8c2ce63f5a4 -r 297b3529876a Modules/_io/fileio.c --- a/Modules/_io/fileio.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/_io/fileio.c Fri Jan 25 22:52:26 2013 +0100 @@ -202,14 +202,14 @@ return 0; } - static int fileio_init(PyObject *oself, PyObject *args, PyObject *kwds) { fileio *self = (fileio *) oself; - static char *kwlist[] = {"file", "mode", "closefd", "opener", NULL}; + static char *kwlist[] = {"file", "mode", "closefd", "opener", "cloexec", NULL}; const char *name = NULL; PyObject *nameobj, *stringobj = NULL, *opener = Py_None; + int cloexec = Py_DefaultCloexec; char *mode = "r"; char *s; #ifdef MS_WINDOWS @@ -221,6 +221,12 @@ int fd = -1; int closefd = 1; int fd_is_own = 0; +#ifdef O_CLOEXEC + static int cloexec_works = -1; + int *atomic_flags_works = &cloexec_works; +#else + int *atomic_flags_works = NULL; +#endif assert(PyFileIO_Check(oself)); if (self->fd >= 0) { @@ -233,9 +239,10 @@ self->fd = -1; } - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|siO:fileio", + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|siOO&:fileio", kwlist, &nameobj, &mode, &closefd, - &opener)) + &opener, + _Py_cloexec_converter, &cloexec)) return -1; if (PyFloat_Check(nameobj)) { @@ -345,6 +352,13 @@ if (append) flags |= O_APPEND; #endif + if (cloexec) { +#ifdef MS_WINDOWS + flags |= O_NOINHERIT; +#elif defined(O_CLOEXEC) + flags |= O_CLOEXEC; +#endif + } if (fd >= 0) { if (check_fd(fd)) @@ -361,7 +375,7 @@ } errno = 0; - if (opener == Py_None) { + if (opener == Py_None && !cloexec) { Py_BEGIN_ALLOW_THREADS #ifdef MS_WINDOWS if (widename != NULL) @@ -369,10 +383,24 @@ else #endif self->fd = open(name, flags, 0666); + Py_END_ALLOW_THREADS - } else { - PyObject *fdobj = PyObject_CallFunction( - opener, "Oi", nameobj, flags); + } + else if (opener == Py_None && cloexec) { + /* We hold the GIL which offers some protection from other code + * calling fork() before the CLOEXEC flags have been set but we + * can't guarantee anything without O_CLOEXEC / O_NOINHERIT. */ +#ifdef MS_WINDOWS + if (widename != NULL) + self->fd = _wopen(widename, flags, 0666); + else +#endif + self->fd = open(name, flags, 0666); + } + else { + PyObject *fdobj; + + fdobj = PyObject_CallFunction(opener, "Oi", nameobj, flags); if (fdobj == NULL) goto error; if (!PyLong_Check(fdobj)) { @@ -389,6 +417,15 @@ } } +#ifndef MS_WINDOWS + if (cloexec && self->fd >= 0) { + if (_Py_set_cloexec(self->fd, 1, atomic_flags_works) < 0) { + close(self->fd); + self->fd = -1; + } + } +#endif + fd_is_own = 1; if (self->fd < 0) { PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, nameobj); diff -r d8c2ce63f5a4 -r 297b3529876a Modules/_multiprocessing/semaphore.c --- a/Modules/_multiprocessing/semaphore.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/_multiprocessing/semaphore.c Fri Jan 25 22:52:26 2013 +0100 @@ -43,7 +43,7 @@ { long previous; - switch (WaitForSingleObjectEx(handle, 0, FALSE)) { + switch (WaitForSingleObject(handle, 0)) { case WAIT_OBJECT_0: if (!ReleaseSemaphore(handle, 1, &previous)) return MP_STANDARD_ERROR; @@ -99,7 +99,7 @@ } /* check whether we can acquire without releasing the GIL and blocking */ - if (WaitForSingleObjectEx(self->handle, 0, FALSE) == WAIT_OBJECT_0) { + if (WaitForSingleObject(self->handle, 0) == WAIT_OBJECT_0) { self->last_tid = GetCurrentThreadId(); ++self->count; Py_RETURN_TRUE; @@ -118,7 +118,7 @@ Py_BEGIN_ALLOW_THREADS if (sigint_event != NULL) ResetEvent(sigint_event); - res = WaitForMultipleObjectsEx(nhandles, handles, FALSE, full_msecs, FALSE); + res = WaitForMultipleObjects(nhandles, handles, FALSE, full_msecs); Py_END_ALLOW_THREADS /* handle result */ diff -r d8c2ce63f5a4 -r 297b3529876a Modules/_posixsubprocess.c --- a/Modules/_posixsubprocess.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/_posixsubprocess.c Fri Jan 25 22:52:26 2013 +0100 @@ -35,7 +35,7 @@ # define FD_DIR "/proc/self/fd" #endif -#define POSIX_CALL(call) if ((call) == -1) goto error +#define POSIX_CALL(call) do { if ((call) == -1) goto error; } while (0) /* Maximum file descriptor, initialized on module load. */ @@ -87,7 +87,7 @@ if (stat("/dev", &dev_stat) != 0) return 0; if (stat(FD_DIR, &dev_fd_stat) != 0) - return 0; + return 0; if (dev_stat.st_dev == dev_fd_stat.st_dev) return 0; /* / == /dev == /dev/fd means it is static. #fail */ return 1; @@ -211,18 +211,8 @@ int fd_dir_fd; if (start_fd >= end_fd) return; -#ifdef O_CLOEXEC - fd_dir_fd = open(FD_DIR, O_RDONLY | O_CLOEXEC, 0); -#else - fd_dir_fd = open(FD_DIR, O_RDONLY, 0); -#ifdef FD_CLOEXEC - { - int old = fcntl(fd_dir_fd, F_GETFD); - if (old != -1) - fcntl(fd_dir_fd, F_SETFD, old | FD_CLOEXEC); - } -#endif -#endif + + fd_dir_fd = _Py_open_cloexec(FD_DIR, O_RDONLY); if (fd_dir_fd == -1) { /* No way to get a list of open fds. */ _close_fds_by_brute_force(start_fd, end_fd, py_fds_to_keep); @@ -363,15 +353,12 @@ char hex_errno[sizeof(saved_errno)*2+1]; /* Close parent's pipe ends. */ - if (p2cwrite != -1) { + if (p2cwrite != -1) POSIX_CALL(close(p2cwrite)); - } - if (c2pread != -1) { + if (c2pread != -1) POSIX_CALL(close(c2pread)); - } - if (errread != -1) { + if (errread != -1) POSIX_CALL(close(errread)); - } POSIX_CALL(close(errpipe_read)); /* When duping fds, if there arises a situation where one of the fds is @@ -384,39 +371,27 @@ /* Dup fds for child. dup2() removes the CLOEXEC flag but we must do it ourselves if dup2() would be a no-op (issue #10806). */ - if (p2cread == 0) { - int old = fcntl(p2cread, F_GETFD); - if (old != -1) - fcntl(p2cread, F_SETFD, old & ~FD_CLOEXEC); - } else if (p2cread != -1) { + if (p2cread == 0) + _Py_try_set_cloexec(p2cread, 0); + else if (p2cread != -1) POSIX_CALL(dup2(p2cread, 0)); /* stdin */ - } - if (c2pwrite == 1) { - int old = fcntl(c2pwrite, F_GETFD); - if (old != -1) - fcntl(c2pwrite, F_SETFD, old & ~FD_CLOEXEC); - } else if (c2pwrite != -1) { + if (c2pwrite == 1) + _Py_try_set_cloexec(c2pwrite, 0); + else if (c2pwrite != -1) POSIX_CALL(dup2(c2pwrite, 1)); /* stdout */ - } - if (errwrite == 2) { - int old = fcntl(errwrite, F_GETFD); - if (old != -1) - fcntl(errwrite, F_SETFD, old & ~FD_CLOEXEC); - } else if (errwrite != -1) { + if (errwrite == 2) + _Py_try_set_cloexec(errwrite, 0); + else if (errwrite != -1) POSIX_CALL(dup2(errwrite, 2)); /* stderr */ - } /* Close pipe fds. Make sure we don't close the same fd more than */ /* once, or standard fds. */ - if (p2cread > 2) { + if (p2cread > 2) POSIX_CALL(close(p2cread)); - } - if (c2pwrite > 2 && c2pwrite != p2cread) { + if (c2pwrite > 2 && c2pwrite != p2cread) POSIX_CALL(close(c2pwrite)); - } - if (errwrite != c2pwrite && errwrite != p2cread && errwrite > 2) { + if (errwrite != c2pwrite && errwrite != p2cread && errwrite > 2) POSIX_CALL(close(errwrite)); - } if (close_fds) { int local_max_fd = max_fd; @@ -549,7 +524,7 @@ PyObject *result; _Py_IDENTIFIER(isenabled); _Py_IDENTIFIER(disable); - + gc_module = PyImport_ImportModule("gc"); if (gc_module == NULL) return NULL; @@ -726,52 +701,6 @@ Raises: Only on an error in the parent process.\n\ "); -PyDoc_STRVAR(subprocess_cloexec_pipe_doc, -"cloexec_pipe() -> (read_end, write_end)\n\n\ -Create a pipe whose ends have the cloexec flag set."); - -static PyObject * -subprocess_cloexec_pipe(PyObject *self, PyObject *noargs) -{ - int fds[2]; - int res; -#ifdef HAVE_PIPE2 - Py_BEGIN_ALLOW_THREADS - res = pipe2(fds, O_CLOEXEC); - Py_END_ALLOW_THREADS - if (res != 0 && errno == ENOSYS) - { - { -#endif - /* We hold the GIL which offers some protection from other code calling - * fork() before the CLOEXEC flags have been set but we can't guarantee - * anything without pipe2(). */ - long oldflags; - - res = pipe(fds); - - if (res == 0) { - oldflags = fcntl(fds[0], F_GETFD, 0); - if (oldflags < 0) res = oldflags; - } - if (res == 0) - res = fcntl(fds[0], F_SETFD, oldflags | FD_CLOEXEC); - - if (res == 0) { - oldflags = fcntl(fds[1], F_GETFD, 0); - if (oldflags < 0) res = oldflags; - } - if (res == 0) - res = fcntl(fds[1], F_SETFD, oldflags | FD_CLOEXEC); -#ifdef HAVE_PIPE2 - } - } -#endif - if (res != 0) - return PyErr_SetFromErrno(PyExc_OSError); - return Py_BuildValue("(ii)", fds[0], fds[1]); -} - /* module level code ********************************************************/ PyDoc_STRVAR(module_doc, @@ -780,7 +709,6 @@ static PyMethodDef module_methods[] = { {"fork_exec", subprocess_fork_exec, METH_VARARGS, subprocess_fork_exec_doc}, - {"cloexec_pipe", subprocess_cloexec_pipe, METH_NOARGS, subprocess_cloexec_pipe_doc}, {NULL, NULL} /* sentinel */ }; diff -r d8c2ce63f5a4 -r 297b3529876a Modules/_ssl.c --- a/Modules/_ssl.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/_ssl.c Fri Jan 25 22:52:26 2013 +0100 @@ -2392,17 +2392,15 @@ PyObject *result; /* The high-level ssl.SSLSocket object */ PyObject *ssl_socket; + PyGILState_STATE gstate; const char *servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name); -#ifdef WITH_THREAD - PyGILState_STATE gstate = PyGILState_Ensure(); -#endif + + gstate = PyGILState_Ensure(); if (ssl_ctx->set_hostname == NULL) { /* remove race condition in this the call back while if removing the * callback is in progress */ -#ifdef WITH_THREAD PyGILState_Release(gstate); -#endif return SSL_TLSEXT_ERR_OK; } @@ -2451,18 +2449,14 @@ Py_DECREF(result); } -#ifdef WITH_THREAD PyGILState_Release(gstate); -#endif return ret; error: Py_DECREF(ssl_socket); *al = SSL_AD_INTERNAL_ERROR; ret = SSL_TLSEXT_ERR_ALERT_FATAL; -#ifdef WITH_THREAD PyGILState_Release(gstate); -#endif return ret; } diff -r d8c2ce63f5a4 -r 297b3529876a Modules/itertoolsmodule.c --- a/Modules/itertoolsmodule.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/itertoolsmodule.c Fri Jan 25 22:52:26 2013 +0100 @@ -473,31 +473,14 @@ return 0; } -static void -teedataobject_safe_decref(PyObject *obj) -{ - while (obj && Py_TYPE(obj) == &teedataobject_type && - Py_REFCNT(obj) == 1) { - PyObject *nextlink = ((teedataobject *)obj)->nextlink; - ((teedataobject *)obj)->nextlink = NULL; - Py_DECREF(obj); - obj = nextlink; - } - Py_XDECREF(obj); -} - static int teedataobject_clear(teedataobject *tdo) { int i; - PyObject *tmp; - Py_CLEAR(tdo->it); for (i=0 ; inumread ; i++) Py_CLEAR(tdo->values[i]); - tmp = tdo->nextlink; - tdo->nextlink = NULL; - teedataobject_safe_decref(tmp); + Py_CLEAR(tdo->nextlink); return 0; } @@ -634,8 +617,6 @@ if (to->index >= LINKCELLS) { link = teedataobject_jumplink(to->dataobj); - if (link == NULL) - return NULL; Py_DECREF(to->dataobj); to->dataobj = (teedataobject *)link; to->index = 0; @@ -964,7 +945,7 @@ /* Create a new cycle with the iterator tuple, then set * the saved state on it. */ - return Py_BuildValue("O(O)(Oi)", Py_TYPE(lz), + return Py_BuildValue("O(O)(Oi)", Py_TYPE(lz), lz->it, lz->saved, lz->firstpass); } @@ -3154,7 +3135,7 @@ goto err; PyTuple_SET_ITEM(indices, i, index); } - + cycles = PyTuple_New(po->r); if (cycles == NULL) goto err; @@ -3180,7 +3161,7 @@ { PyObject *indices, *cycles, *result; Py_ssize_t n, i; - + if (!PyArg_ParseTuple(state, "O!O!", &PyTuple_Type, &indices, &PyTuple_Type, &cycles)) @@ -3359,18 +3340,18 @@ accumulate_next(accumulateobject *lz) { PyObject *val, *oldtotal, *newtotal; - + val = PyIter_Next(lz->it); if (val == NULL) return NULL; - + if (lz->total == NULL) { Py_INCREF(val); lz->total = val; return lz->total; } - if (lz->binop == NULL) + if (lz->binop == NULL) newtotal = PyNumber_Add(lz->total, val); else newtotal = PyObject_CallFunctionObjArgs(lz->binop, lz->total, val, NULL); @@ -3381,7 +3362,7 @@ oldtotal = lz->total; lz->total = newtotal; Py_DECREF(oldtotal); - + Py_INCREF(newtotal); return newtotal; } @@ -4351,7 +4332,7 @@ static PyObject * zip_longest_reduce(ziplongestobject *lz) { - + /* Create a new tuple with empty sequences where appropriate to pickle. * Then use setstate to set the fillvalue */ diff -r d8c2ce63f5a4 -r 297b3529876a Modules/main.c --- a/Modules/main.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/main.c Fri Jan 25 22:52:26 2013 +0100 @@ -22,6 +22,10 @@ #include #endif +#ifdef HAVE_FCNTL_H +#include +#endif /* HAVE_FCNTL_H */ + #if defined(MS_WINDOWS) #define PYTHONHOMEHELP "\\lib" #else @@ -43,7 +47,7 @@ static int orig_argc; /* command line options */ -#define BASE_OPTS L"bBc:dEhiJm:OqRsStuvVW:xX:?" +#define BASE_OPTS L"bBc:deEhiJm:OqRsStuvVW:xX:?" #define PROGRAM_OPTS BASE_OPTS @@ -59,6 +63,8 @@ -B : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\ -c cmd : program passed in as string (terminates option list)\n\ -d : debug output from parser; also PYTHONDEBUG=x\n\ +-e : set default value of the cloexec (close-on-exec) parameter\n\ + to True; also PYTHONCLOEXEC=1\n\ -E : ignore PYTHON* environment variables (such as PYTHONPATH)\n\ -h : print this help message and exit (also --help)\n\ "; @@ -104,6 +110,8 @@ to seed the hashes of str, bytes and datetime objects. It can also be\n\ set to an integer in the range [0,4294967295] to get hash values with a\n\ predictable seed.\n\ +PYTHONCLOEXEC: set default value of the cloexec (close-on-exec) parameter\n\ + to True.\n\ "; static int @@ -141,7 +149,12 @@ { char *startup = Py_GETENV("PYTHONSTARTUP"); if (startup != NULL && startup[0] != '\0') { - FILE *fp = fopen(startup, "r"); + FILE *fp; + int fd = _Py_open(startup, O_RDONLY); + if (fd >= 0) + fp = fdopen(fd, "r"); + else + fp = NULL; if (fp != NULL) { (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf); PyErr_Clear(); @@ -403,6 +416,10 @@ Py_DontWriteBytecodeFlag++; break; + case 'e': + Py_DefaultCloexec = 1; + break; + case 's': Py_NoUserSiteDirectory++; break; diff -r d8c2ce63f5a4 -r 297b3529876a Modules/mmapmodule.c --- a/Modules/mmapmodule.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/mmapmodule.c Fri Jan 25 22:52:26 2013 +0100 @@ -1205,7 +1205,7 @@ flags |= MAP_ANONYMOUS; #else /* SVR4 method to map anonymous memory is to open /dev/zero */ - fd = devzero = open("/dev/zero", O_RDWR); + fd = devzero = _Py_open("/dev/zero", O_RDWR); if (devzero == -1) { Py_DECREF(m_obj); PyErr_SetFromErrno(PyExc_OSError); @@ -1219,6 +1219,7 @@ PyErr_SetFromErrno(PyExc_OSError); return NULL; } + _Py_try_set_default_cloexec(m_obj->fd); } m_obj->data = mmap(NULL, map_size, diff -r d8c2ce63f5a4 -r 297b3529876a Modules/ossaudiodev.c --- a/Modules/ossaudiodev.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/ossaudiodev.c Fri Jan 25 22:52:26 2013 +0100 @@ -115,7 +115,9 @@ one open at a time. This does *not* affect later I/O; OSS provides a special ioctl() for non-blocking read/write, which is exposed via oss_nonblock() below. */ - if ((fd = open(devicename, imode|O_NONBLOCK)) == -1) { + fd = _Py_open(devicename, imode|O_NONBLOCK); + + if (fd == -1) { PyErr_SetFromErrnoWithFilename(PyExc_IOError, devicename); return NULL; } @@ -177,7 +179,8 @@ devicename = "/dev/mixer"; } - if ((fd = open(devicename, O_RDWR)) == -1) { + fd = _Py_open(devicename, O_RDWR); + if (fd == -1) { PyErr_SetFromErrnoWithFilename(PyExc_IOError, devicename); return NULL; } diff -r d8c2ce63f5a4 -r 297b3529876a Modules/posixmodule.c --- a/Modules/posixmodule.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/posixmodule.c Fri Jan 25 22:52:26 2013 +0100 @@ -924,10 +924,9 @@ #endif /* MS_WINDOWS */ /* Return a dictionary corresponding to the POSIX environment table */ -#if defined(WITH_NEXT_FRAMEWORK) || (defined(__APPLE__) && defined(Py_ENABLE_SHARED)) +#ifdef WITH_NEXT_FRAMEWORK /* On Darwin/MacOSX a shared library or framework has no access to -** environ directly, we must obtain it with _NSGetEnviron(). See also -** man environ(7). +** environ directly, we must obtain it with _NSGetEnviron(). */ #include static char **environ; @@ -948,7 +947,7 @@ d = PyDict_New(); if (d == NULL) return NULL; -#if defined(WITH_NEXT_FRAMEWORK) || (defined(__APPLE__) && defined(Py_ENABLE_SHARED)) +#ifdef WITH_NEXT_FRAMEWORK if (environ == NULL) environ = *_NSGetEnviron(); #endif @@ -5448,14 +5447,16 @@ #if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX) PyDoc_STRVAR(posix_openpty__doc__, -"openpty() -> (master_fd, slave_fd)\n\n\ +"openpty(cloexec=None) -> (master_fd, slave_fd)\n\n\ Open a pseudo-terminal, returning open fd's for both master and slave end.\n"); static PyObject * -posix_openpty(PyObject *self, PyObject *noargs) -{ +posix_openpty(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *keywords[] = {"cloexec", NULL}; int master_fd, slave_fd; #ifndef HAVE_OPENPTY + int flags; char * slave_name; #endif #if defined(HAVE_DEV_PTMX) && !defined(HAVE_OPENPTY) && !defined(HAVE__GETPTY) @@ -5464,22 +5465,51 @@ extern char *ptsname(int fildes); #endif #endif + int cloexec = Py_DefaultCloexec; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O&:openpty", keywords, + _Py_cloexec_converter, &cloexec)) + return NULL; #ifdef HAVE_OPENPTY if (openpty(&master_fd, &slave_fd, NULL, NULL, NULL) != 0) return posix_error(); + + if (cloexec && _Py_set_cloexec(master_fd, 1, NULL) < 0) + goto error; + if (cloexec && _Py_set_cloexec(slave_fd, 1, NULL) < 0) + goto error; + #elif defined(HAVE__GETPTY) slave_name = _getpty(&master_fd, O_RDWR, 0666, 0); if (slave_name == NULL) return posix_error(); - - slave_fd = open(slave_name, O_RDWR); + if (cloexec && _Py_set_cloexec(master_fd, 1, NULL) < 0) + goto error; + + flags = O_RDWR; +#ifdef O_CLOEXEC + if (cloexec) + flags |= O_CLOEXEC; +#endif + slave_fd = open(slave_name, flags); if (slave_fd < 0) return posix_error(); -#else - master_fd = open(DEV_PTY_FILE, O_RDWR | O_NOCTTY); /* open master */ + if (cloexec && _Py_set_cloexec(slave_fd, 1, NULL) < 0) + goto error; + +#else + flags = O_RDWR | O_NOCTTY; +#ifdef O_CLOEXEC + if (cloexec) + flags |= O_CLOEXEC; +#endif + master_fd = open(DEV_PTY_FILE, flags); /* open master */ if (master_fd < 0) return posix_error(); + if (cloexec && _Py_set_cloexec(master_fd, 1, NULL) < 0) + goto error; + sig_saved = PyOS_setsig(SIGCHLD, SIG_DFL); /* change permission of slave */ if (grantpt(master_fd) < 0) { @@ -5495,9 +5525,16 @@ slave_name = ptsname(master_fd); /* get name of slave */ if (slave_name == NULL) return posix_error(); - slave_fd = open(slave_name, O_RDWR | O_NOCTTY); /* open slave */ + flags = O_RDWR | O_NOCTTY; +#ifdef O_CLOEXEC + if (cloexec) + flags |= O_CLOEXEC; +#endif + slave_fd = open(slave_name, flags); /* open slave */ if (slave_fd < 0) return posix_error(); + if (cloexec && _Py_set_cloexec(slave_fd, 1, NULL) < 0) + goto error; #if !defined(__CYGWIN__) && !defined(HAVE_DEV_PTC) ioctl(slave_fd, I_PUSH, "ptem"); /* push ptem */ ioctl(slave_fd, I_PUSH, "ldterm"); /* push ldterm */ @@ -5509,6 +5546,10 @@ return Py_BuildValue("(ii)", master_fd, slave_fd); +error: + close(master_fd); + close(slave_fd); + return NULL; } #endif /* defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX) */ @@ -6994,13 +7035,15 @@ /* Functions acting on file descriptors */ PyDoc_STRVAR(posix_open__doc__, -"open(path, flags, mode=0o777, *, dir_fd=None)\n\n\ +"open(path, flags, mode=0o777, *, dir_fd=None, cloexec=None)\n\n\ Open a file for low level IO. Returns a file handle (integer).\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 implemented on your platform.\n\ - If it is unavailable, using it will raise a NotImplementedError."); + If it is unavailable, using it will raise a NotImplementedError.\n\ +\n\ +If cloexec is True, set close-on-exec flag."); static PyObject * posix_open(PyObject *self, PyObject *args, PyObject *kwargs) @@ -7009,22 +7052,31 @@ int flags; int mode = 0777; int dir_fd = DEFAULT_DIR_FD; + int cloexec = Py_DefaultCloexec; int fd; PyObject *return_value = NULL; - static char *keywords[] = {"path", "flags", "mode", "dir_fd", NULL}; + static char *keywords[] = {"path", "flags", "mode", "dir_fd", "cloexec", NULL}; memset(&path, 0, sizeof(path)); path.function_name = "open"; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&i|i$O&:open", keywords, + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&i|i$O&O&:open", keywords, path_converter, &path, &flags, &mode, #ifdef HAVE_OPENAT - dir_fd_converter, &dir_fd -#else - dir_fd_unavailable, &dir_fd -#endif - )) - return NULL; + dir_fd_converter, &dir_fd, +#else + dir_fd_unavailable, &dir_fd, +#endif + _Py_cloexec_converter, &cloexec)) + return NULL; + + if (cloexec) { +#ifdef MS_WINDOWS + flags |= O_NOINHERIT; +#elif defined(O_CLOEXEC) + flags |= O_CLOEXEC; +#endif + } Py_BEGIN_ALLOW_THREADS #ifdef MS_WINDOWS @@ -7045,6 +7097,23 @@ goto exit; } +#ifndef MS_WINDOWS + if (cloexec) { +#ifdef O_CLOEXEC + /* Linux kernel older than 2.6.23 ignores O_CLOEXEC flag */ + static int cloexec_works = -1; + int *atomic_flag_works = &cloexec_works; +#else + int *atomic_flag_works = NULL; +#endif + if (_Py_set_cloexec(fd, 1, atomic_flag_works) < 0) { + close(fd); + PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path.object); + goto exit; + } + } +#endif + return_value = PyLong_FromLong((long)fd); exit: @@ -7094,39 +7163,93 @@ PyDoc_STRVAR(posix_dup__doc__, -"dup(fd) -> fd2\n\n\ -Return a duplicate of a file descriptor."); - -static PyObject * -posix_dup(PyObject *self, PyObject *args) -{ + "dup(fd, cloexec=True) -> fd2\n\n" + "Return a duplicate of a file descriptor.\n" + "If cloexec is True, set close-on-exec flag."); + +static PyObject * +posix_dup(PyObject *self, PyObject *args, PyObject *kwargs) +{ + static char *keywords[] = {"fd", "cloexec", NULL}; int fd; - if (!PyArg_ParseTuple(args, "i:dup", &fd)) - return NULL; + int cloexec = Py_DefaultCloexec; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|O&:dup", keywords, + &fd, _Py_cloexec_converter, &cloexec)) + return NULL; + if (!_PyVerify_fd(fd)) return posix_error(); - fd = dup(fd); - if (fd < 0) - return posix_error(); +#if defined(HAVE_FCNTL_H) && defined(F_DUPFD_CLOEXEC) + if (cloexec) { + fd = fcntl(fd, F_DUPFD_CLOEXEC, 0); + if (fd < 0) + return posix_error(); + } + else { +#endif + fd = dup(fd); + if (fd < 0) + return posix_error(); + if (cloexec && _Py_set_cloexec(fd, 1, NULL) < 0) + return NULL; +#if defined(HAVE_FCNTL_H) && defined(F_DUPFD_CLOEXEC) + } +#endif return PyLong_FromLong((long)fd); } PyDoc_STRVAR(posix_dup2__doc__, -"dup2(old_fd, new_fd)\n\n\ -Duplicate file descriptor."); - -static PyObject * -posix_dup2(PyObject *self, PyObject *args) -{ +"dup2(fd, fd2, cloexec=True)\n\n\ +Duplicate file descriptor. If cloexec is True, set close-on-exec flag on fd2."); + +static PyObject * +posix_dup2(PyObject *self, PyObject *args, PyObject *kwds) +{ + static char *keywords[] = {"fd", "fd2", "cloexec", NULL}; int fd, fd2, res; - if (!PyArg_ParseTuple(args, "ii:dup2", &fd, &fd2)) + int cloexec = Py_DefaultCloexec; +#ifdef HAVE_DUP3 + /* dup3() is available on Linux 2.6.27+ and glibc 2.9 */ + int dup3_works = -1; +#endif + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "ii|O&:dup2", keywords, + &fd, &fd2, + _Py_cloexec_converter, &cloexec)) return NULL; if (!_PyVerify_fd_dup2(fd, fd2)) return posix_error(); - res = dup2(fd, fd2); - if (res < 0) - return posix_error(); + +#ifdef HAVE_DUP3 + if (dup3_works != 0) { + int flags; + if (cloexec) + flags = O_CLOEXEC; + else + flags = 0; + res = dup3(fd, fd2, flags); + if (res < 0) { + if (dup3_works == -1) + dup3_works = (errno != ENOSYS); + if (dup3_works) + return posix_error(); + } + } + + if (dup3_works == 0) + { +#endif + res = dup2(fd, fd2); + if (res < 0) + return posix_error(); + if (cloexec && _Py_set_cloexec(fd2, 1, NULL) < 0) + return NULL; +#ifdef HAVE_DUP3 + } +#endif + Py_INCREF(Py_None); return Py_None; } @@ -7606,30 +7729,78 @@ #ifdef HAVE_PIPE PyDoc_STRVAR(posix_pipe__doc__, -"pipe() -> (read_end, write_end)\n\n\ -Create a pipe."); - -static PyObject * -posix_pipe(PyObject *self, PyObject *noargs) -{ -#if !defined(MS_WINDOWS) +"pipe() -> (read_end, write_end)\n\n" +"Create a pipe. If cloexec is True, set close-on-exec flag."); + +static PyObject * +posix_pipe(PyObject *self, PyObject *args, PyObject *kwargs) +{ + static char *keywords[] = {"cloexec", NULL}; int fds[2]; + int cloexec = Py_DefaultCloexec; +#if defined(MS_WINDOWS) + HANDLE read, write; + SECURITY_ATTRIBUTES attr; + BOOL ok; +#else +#ifdef HAVE_PIPE2 + int flags; +#endif int res; - res = pipe(fds); - if (res != 0) - return posix_error(); - return Py_BuildValue("(ii)", fds[0], fds[1]); -#else /* MS_WINDOWS */ - HANDLE read, write; - int read_fd, write_fd; - BOOL ok; - ok = CreatePipe(&read, &write, NULL, 0); +#endif + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O&:pipe", keywords, + _Py_cloexec_converter, &cloexec)) + return NULL; + +#if defined(MS_WINDOWS) + attr.nLength = sizeof(attr); + attr.lpSecurityDescriptor = NULL; + attr.bInheritHandle = (cloexec ? FALSE : TRUE); + + Py_BEGIN_ALLOW_THREADS + ok = CreatePipe(&read, &write, &attr, 0); + if (ok) { + fds[0] = _open_osfhandle((Py_intptr_t)read, _O_RDONLY); + ok = (fds[0] != -1); + } + if (ok) { + fds[1] = _open_osfhandle((Py_intptr_t)write, _O_WRONLY); + ok = (fds[1] != -1); + } + Py_END_ALLOW_THREADS + if (!ok) return PyErr_SetFromWindowsErr(0); - read_fd = _open_osfhandle((Py_intptr_t)read, 0); - write_fd = _open_osfhandle((Py_intptr_t)write, 1); - return Py_BuildValue("(ii)", read_fd, write_fd); +#else +#ifdef HAVE_PIPE2 + flags = cloexec ? O_CLOEXEC : 0; + + Py_BEGIN_ALLOW_THREADS + res = pipe2(fds, flags); + Py_END_ALLOW_THREADS + + if (res != 0 && errno == ENOSYS) + { +#endif + Py_BEGIN_ALLOW_THREADS + res = pipe(fds); + Py_END_ALLOW_THREADS + + if (cloexec && res == 0) { + if (_Py_set_cloexec(fds[0], 1, NULL) < 0) + return NULL; + if (_Py_set_cloexec(fds[1], 1, NULL) < 0) + return NULL; + } +#ifdef HAVE_PIPE2 + } +#endif + + if (res != 0) + return PyErr_SetFromErrno(PyExc_OSError); #endif /* MS_WINDOWS */ + return Py_BuildValue("(ii)", fds[0], fds[1]); } #endif /* HAVE_PIPE */ @@ -10182,6 +10353,65 @@ } #endif /* defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL) */ +#if defined(MS_WINDOWS) \ + || (defined(HAVE_SYS_IOCTL_H) && defined(FIOCLEX) && defined(FIONCLEX)) \ + || defined(HAVE_FCNTL_H) +#define POSIX_SET_CLOEXEC +#endif + +#ifdef POSIX_SET_CLOEXEC +PyDoc_STRVAR(get_cloexec__doc__, + "get_cloexec(fd) -> bool\n" \ + "\n" \ + "Get the close-on-exe flag of the specified file descriptor."); + +static PyObject* +posix_get_cloexec(PyObject *self, PyObject *args) +{ + int fd; + int cloexec; + + if (!PyArg_ParseTuple(args, "i:get_cloexec", &fd)) + return NULL; + +#ifdef MS_WINDOWS + if (!_PyVerify_fd(fd)) { + /* fd may be an handle, ex: handle of a Windows socket */ + fd = _open_osfhandle((Py_intptr_t)fd, _O_RDONLY); + if (fd == -1) { + PyErr_SetFromWindowsErr(0); + return NULL; + } + } +#endif + + cloexec = _Py_get_cloexec(fd); + if (cloexec < 0) + return NULL; + return PyBool_FromLong(cloexec); +} + +PyDoc_STRVAR(set_cloexec__doc__, + "set_cloexec(fd, cloexec=True)\n" \ + "\n" \ + "Set or clear close-on-exe flag on the specified file descriptor."); + +static PyObject* +posix_set_cloexec(PyObject *self, PyObject *args) +{ + int fd; + int cloexec = 1; + + if (!PyArg_ParseTuple(args, "i|i:set_cloexec", &fd, &cloexec)) + return NULL; + + if (_Py_set_cloexec(fd, cloexec, NULL) < 0) + return NULL; + Py_RETURN_NONE; +} +#endif /* POSIX_SET_CLOEXEC */ + + static PyMethodDef posix_methods[] = { {"access", (PyCFunction)posix_access, @@ -10346,7 +10576,8 @@ #endif #endif /* HAVE_SCHED_H */ #if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX) - {"openpty", posix_openpty, METH_NOARGS, posix_openpty__doc__}, + {"openpty", (PyCFunction)posix_openpty, + METH_VARARGS | METH_KEYWORDS, posix_openpty__doc__}, #endif /* HAVE_OPENPTY || HAVE__GETPTY || HAVE_DEV_PTMX */ #ifdef HAVE_FORKPTY {"forkpty", posix_forkpty, METH_NOARGS, posix_forkpty__doc__}, @@ -10458,8 +10689,10 @@ {"close", posix_close, METH_VARARGS, posix_close__doc__}, {"closerange", posix_closerange, METH_VARARGS, posix_closerange__doc__}, {"device_encoding", device_encoding, METH_VARARGS, device_encoding__doc__}, - {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, - {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, + {"dup", (PyCFunction)posix_dup, + METH_VARARGS | METH_KEYWORDS, posix_dup__doc__}, + {"dup2", (PyCFunction)posix_dup2, + METH_VARARGS | METH_KEYWORDS, posix_dup2__doc__}, #ifdef HAVE_LOCKF {"lockf", posix_lockf, METH_VARARGS, posix_lockf__doc__}, #endif @@ -10485,7 +10718,8 @@ {"fstat", posix_fstat, METH_VARARGS, posix_fstat__doc__}, {"isatty", posix_isatty, METH_VARARGS, posix_isatty__doc__}, #ifdef HAVE_PIPE - {"pipe", posix_pipe, METH_NOARGS, posix_pipe__doc__}, + {"pipe", (PyCFunction)posix_pipe, + METH_VARARGS | METH_KEYWORDS, posix_pipe__doc__}, #endif #ifdef HAVE_PIPE2 {"pipe2", posix_pipe2, METH_O, posix_pipe2__doc__}, @@ -10627,6 +10861,10 @@ #if defined(TERMSIZE_USE_CONIO) || defined(TERMSIZE_USE_IOCTL) {"get_terminal_size", get_terminal_size, METH_VARARGS, termsize__doc__}, #endif +#ifdef POSIX_SET_CLOEXEC + {"get_cloexec", posix_get_cloexec, METH_VARARGS, get_cloexec__doc__}, + {"set_cloexec", posix_set_cloexec, METH_VARARGS, set_cloexec__doc__}, +#endif {NULL, NULL} /* Sentinel */ }; diff -r d8c2ce63f5a4 -r 297b3529876a Modules/selectmodule.c --- a/Modules/selectmodule.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/selectmodule.c Fri Jan 25 22:52:26 2013 +0100 @@ -911,7 +911,7 @@ */ limit_result = getrlimit(RLIMIT_NOFILE, &limit); if (limit_result != -1) - fd_devpoll = open("/dev/poll", O_RDWR); + fd_devpoll = _Py_open("/dev/poll", O_RDWR); Py_END_ALLOW_THREADS if (limit_result == -1) { @@ -2115,7 +2115,7 @@ static PyMethodDef select_methods[] = { {"select", select_select, METH_VARARGS, select_doc}, -#if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL) +#ifdef HAVE_POLL {"poll", select_poll, METH_NOARGS, poll_doc}, #endif /* HAVE_POLL */ #ifdef HAVE_SYS_DEVPOLL_H @@ -2165,7 +2165,7 @@ PyModule_AddIntConstant(m, "PIPE_BUF", PIPE_BUF); #endif -#if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL) +#if defined(HAVE_POLL) #ifdef __APPLE__ if (select_have_broken_poll()) { if (PyObject_DelAttrString(m, "poll") == -1) { diff -r d8c2ce63f5a4 -r 297b3529876a Modules/signalmodule.c --- a/Modules/signalmodule.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/signalmodule.c Fri Jan 25 22:52:26 2013 +0100 @@ -422,7 +422,7 @@ return NULL; } #endif - if (fd != -1 && (!_PyVerify_fd(fd) || fstat(fd, &buf) != 0)) { + if (fd != -1 && fstat(fd, &buf) != 0) { PyErr_SetString(PyExc_ValueError, "invalid fd"); return NULL; } diff -r d8c2ce63f5a4 -r 297b3529876a Modules/socketmodule.c --- a/Modules/socketmodule.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/socketmodule.c Fri Jan 25 22:52:26 2013 +0100 @@ -100,13 +100,14 @@ /* Socket object documentation */ PyDoc_STRVAR(sock_doc, -"socket([family[, type[, proto]]]) -> socket object\n\ +"socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None, cloexec=None) -> socket object\n\ \n\ Open a socket of the given type. The family argument specifies the\n\ address family; it defaults to AF_INET. The type argument specifies\n\ whether this is a stream (SOCK_STREAM, this is the default)\n\ or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\ specifying the default protocol. Keyword arguments are accepted.\n\ +If cloexec is True, set close-on-exec flag.\n\ \n\ A socket object represents one endpoint of a network connection.\n\ \n\ @@ -1641,7 +1642,7 @@ return 0; } #endif - + #ifdef PF_SYSTEM case PF_SYSTEM: switch (s->sock_proto) { @@ -1649,10 +1650,10 @@ case SYSPROTO_CONTROL: { struct sockaddr_ctl *addr; - + addr = (struct sockaddr_ctl *)addr_ret; addr->sc_family = AF_SYSTEM; - addr->ss_sysaddr = AF_SYS_CONTROL; + addr->ss_sysaddr = AF_SYS_CONTROL; if (PyUnicode_Check(args)) { struct ctl_info info; @@ -1678,17 +1679,17 @@ "cannot find kernel control with provided name"); return 0; } - + addr->sc_id = info.ctl_id; addr->sc_unit = 0; } else if (!PyArg_ParseTuple(args, "II", &(addr->sc_id), &(addr->sc_unit))) { PyErr_SetString(PyExc_TypeError, "getsockaddrarg: " "expected str or tuple of two ints"); - + return 0; } - + *len_ret = sizeof(*addr); return 1; } @@ -1805,7 +1806,7 @@ return 1; } #endif - + #ifdef PF_SYSTEM case PF_SYSTEM: switch(s->sock_proto) { @@ -1946,8 +1947,9 @@ /* s._accept() -> (fd, address) */ static PyObject * -sock_accept(PySocketSockObject *s) +sock_accept(PySocketSockObject *s, PyObject *args, PyObject *kwds) { + static char *kwlist[] = {"cloexec", 0}; sock_addr_t addrbuf; SOCKET_T newfd = INVALID_SOCKET; socklen_t addrlen; @@ -1955,6 +1957,17 @@ PyObject *addr = NULL; PyObject *res = NULL; int timeout; + int cloexec = Py_DefaultCloexec; +#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) + /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */ + static int accept4_works = -1; +#endif + + /* Get the buffer's memory */ + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O&:_accept", kwlist, + _Py_cloexec_converter, &cloexec)) + return NULL; + if (!getsockaddrlen(s, &addrlen)) return NULL; memset(&addrbuf, 0, addrlen); @@ -1963,10 +1976,26 @@ return select_error(); BEGIN_SELECT_LOOP(s) + Py_BEGIN_ALLOW_THREADS timeout = internal_select_ex(s, 0, interval); if (!timeout) { +#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) + if (accept4_works != 0) { + int flags; + if (cloexec) + flags = SOCK_CLOEXEC; + else + flags = 0; + newfd = accept4(s->sock_fd, SAS2SA(&addrbuf), &addrlen, flags); + if (newfd == INVALID_SOCKET && accept4_works == -1) + accept4_works = (errno != ENOSYS); + } + if (accept4_works == 0) + newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen); +#else newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen); +#endif } Py_END_ALLOW_THREADS @@ -1979,6 +2008,29 @@ if (newfd == INVALID_SOCKET) return s->errorhandler(); + if (cloexec +#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC) + && accept4_works == 0 +#endif + ) + { + int os_fd; +#ifdef MS_WINDOWS + os_fd = _open_osfhandle((Py_intptr_t)newfd, O_RDWR); + if (os_fd == -1) { + PyErr_SetFromWindowsErr(0); + SOCKETCLOSE(newfd); + goto finally; + } +#else + os_fd = newfd; +#endif + if (_Py_set_cloexec(os_fd, 1, NULL) < 0) { + SOCKETCLOSE(newfd); + goto finally; + } + } + sock = PyLong_FromSocket_t(newfd); if (sock == NULL) { SOCKETCLOSE(newfd); @@ -1999,11 +2051,12 @@ } PyDoc_STRVAR(accept_doc, -"_accept() -> (integer, address info)\n\ +"_accept(cloexec=None) -> (integer, address info)\n\ \n\ Wait for an incoming connection. Return a new socket file descriptor\n\ representing the connection, and the address of the client.\n\ -For IP sockets, the address info is a pair (hostaddr, port)."); +For IP sockets, the address info is a pair (hostaddr, port).\n\ +If cloexec is True, set close-on-exec flag."); /* s.setblocking(flag) method. Argument: False -- non-blocking mode; same as settimeout(0) @@ -3741,8 +3794,8 @@ /* List of methods for socket objects */ static PyMethodDef sock_methods[] = { - {"_accept", (PyCFunction)sock_accept, METH_NOARGS, - accept_doc}, + {"_accept", (PyCFunction)sock_accept, + METH_VARARGS | METH_KEYWORDS, accept_doc}, {"bind", (PyCFunction)sock_bind, METH_O, bind_doc}, {"close", (PyCFunction)sock_close, METH_NOARGS, @@ -3888,13 +3941,32 @@ { PySocketSockObject *s = (PySocketSockObject *)self; PyObject *fdobj = NULL; + int cloexec = Py_DefaultCloexec; SOCKET_T fd = INVALID_SOCKET; int family = AF_INET, type = SOCK_STREAM, proto = 0; - static char *keywords[] = {"family", "type", "proto", "fileno", 0}; + static char *keywords[] = {"family", "type", "proto", "fileno", "cloexec", 0}; +#if defined(MS_WINDOWS) + +#ifndef WSA_FLAG_NO_HANDLE_INHERIT +#define WSA_FLAG_NO_HANDLE_INHERIT 0x80 +#endif + + /* WSA_FLAG_NO_HANDLE_INHERIT is supported on Windows 7 with SP1, Windows + * Server 2008 R2 with SP1, and later */ + static int wsa_no_inherit_works = -1; + int *atomic_flag_works = &wsa_no_inherit_works; +#elif defined(SOCK_CLOEXEC) + /* Linux kernel older than 2.6.27 ignores SOCK_CLOEXEC flag */ + static int sock_cloexec_works = -1; + int *atomic_flag_works = &sock_cloexec_works; +#else + int *atomic_flag_works = NULL; +#endif if (!PyArg_ParseTupleAndKeywords(args, kwds, - "|iiiO:socket", keywords, - &family, &type, &proto, &fdobj)) + "|iiiOO&:socket", keywords, + &family, &type, &proto, &fdobj, + _Py_cloexec_converter, &cloexec)) return -1; if (fdobj != NULL && fdobj != Py_None) { @@ -3902,6 +3974,7 @@ /* recreate a socket that was duplicated */ if (PyBytes_Check(fdobj)) { WSAPROTOCOL_INFO info; + DWORD flags = WSA_FLAG_OVERLAPPED; if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) { PyErr_Format(PyExc_ValueError, "socket descriptor string has wrong size, " @@ -3909,9 +3982,11 @@ return -1; } memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info)); + if (cloexec) + flags |= WSA_FLAG_NO_HANDLE_INHERIT; Py_BEGIN_ALLOW_THREADS fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, - FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED); + FROM_PROTOCOL_INFO, &info, 0, flags); Py_END_ALLOW_THREADS if (fd == INVALID_SOCKET) { set_error(); @@ -3935,6 +4010,10 @@ } } else { +#ifdef SOCK_CLOEXEC + if (cloexec) + type |= SOCK_CLOEXEC; +#endif Py_BEGIN_ALLOW_THREADS fd = socket(family, type, proto); Py_END_ALLOW_THREADS @@ -3944,6 +4023,21 @@ return -1; } } + + if (cloexec && (atomic_flag_works == NULL || *atomic_flag_works != 1)) { + int os_fd; +#ifdef MS_WINDOWS + os_fd = _open_osfhandle((Py_intptr_t)fd, O_RDWR); + if (os_fd == -1) { + PyErr_SetFromWindowsErr(0); + return -1; + } +#else + os_fd = fd; +#endif + if (_Py_set_cloexec(os_fd, 1, atomic_flag_works) < 0) + return -1; + } init_sockobject(s, fd, family, type, proto); return 0; @@ -4534,24 +4628,53 @@ /*ARGSUSED*/ static PyObject * -socket_socketpair(PyObject *self, PyObject *args) +socket_socketpair(PyObject *self, PyObject *args, PyObject *kwargs) { + static char *kwlist[] = {"family", "type", "proto", "cloexec", 0}; PySocketSockObject *s0 = NULL, *s1 = NULL; SOCKET_T sv[2]; - int family, type = SOCK_STREAM, proto = 0; + int family = AF_INET, type = SOCK_STREAM, proto = 0; PyObject *res = NULL; + int cloexec = Py_DefaultCloexec; +#ifdef SOCK_CLOEXEC + /* Linux kernel older than 2.6.27 ignores SOCK_CLOEXEC flag */ + static int socketpair_sock_cloexec_works = -1; + int *atomic_flag_works = &socketpair_sock_cloexec_works; +#else + int *atomic_flag_works = NULL; +#endif + int ret; #if defined(AF_UNIX) family = AF_UNIX; #else family = AF_INET; #endif - if (!PyArg_ParseTuple(args, "|iii:socketpair", - &family, &type, &proto)) + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iiiO&:socketpair", kwlist, + &family, &type, &proto, + _Py_cloexec_converter, &cloexec)) return NULL; + +#ifdef SOCK_CLOEXEC + if (cloexec) + type |= SOCK_CLOEXEC; +#endif + /* Create a pair of socket fds */ - if (socketpair(family, type, proto, sv) < 0) + Py_BEGIN_ALLOW_THREADS + ret = socketpair(family, type, proto, sv); + Py_END_ALLOW_THREADS + + if (ret < 0) return set_error(); + + if (cloexec) { + if (_Py_set_cloexec(sv[0], 1, atomic_flag_works) < 0) + goto finally; + if (_Py_set_cloexec(sv[1], 1, atomic_flag_works) < 0) + goto finally; + } + s0 = new_sockobject(sv[0], family, type, proto); if (s0 == NULL) goto finally; @@ -4573,12 +4696,13 @@ } PyDoc_STRVAR(socketpair_doc, -"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\ +"socketpair(family=AF_INET, type=SOCK_STREAM, proto=0, cloexec=None) -> (socket object, socket object)\n\ \n\ Create a pair of socket objects from the sockets returned by the platform\n\ socketpair() function.\n\ The arguments are the same as for socket() except the default family is\n\ -AF_UNIX if defined on the platform; otherwise, the default is AF_INET."); +AF_UNIX if defined on the platform; otherwise, the default is AF_INET.\n\ +If cloexec is True, set close-on-exec flag."); #endif /* HAVE_SOCKETPAIR */ @@ -5354,8 +5478,8 @@ METH_O, dup_doc}, #endif #ifdef HAVE_SOCKETPAIR - {"socketpair", socket_socketpair, - METH_VARARGS, socketpair_doc}, + {"socketpair", (PyCFunction)socket_socketpair, + METH_VARARGS | METH_KEYWORDS, socketpair_doc}, #endif {"ntohs", socket_ntohs, METH_VARARGS, ntohs_doc}, diff -r d8c2ce63f5a4 -r 297b3529876a Modules/timemodule.c --- a/Modules/timemodule.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Modules/timemodule.c Fri Jan 25 22:52:26 2013 +0100 @@ -1574,7 +1574,7 @@ DWORD rc; HANDLE hInterruptEvent = _PyOS_SigintEvent(); ResetEvent(hInterruptEvent); - rc = WaitForSingleObjectEx(hInterruptEvent, ul_millis, FALSE); + rc = WaitForSingleObject(hInterruptEvent, ul_millis); if (rc == WAIT_OBJECT_0) { Py_BLOCK_THREADS errno = EINTR; diff -r d8c2ce63f5a4 -r 297b3529876a Objects/bytesobject.c --- a/Objects/bytesobject.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Objects/bytesobject.c Fri Jan 25 22:52:26 2013 +0100 @@ -489,10 +489,6 @@ errors); goto failed; } - /* skip \x */ - if (s < end && Py_ISXDIGIT(s[0])) - s++; /* and a hexdigit */ - break; default: *p++ = '\\'; s--; diff -r d8c2ce63f5a4 -r 297b3529876a Objects/unicodeobject.c --- a/Objects/unicodeobject.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Objects/unicodeobject.c Fri Jan 25 22:52:26 2013 +0100 @@ -5569,8 +5569,7 @@ /* found a name. look it up in the unicode database */ message = "unknown Unicode character name"; s++; - if (s - start - 1 <= INT_MAX && - ucnhash_CAPI->getcode(NULL, start, (int)(s-start-1), + if (ucnhash_CAPI->getcode(NULL, start, (int)(s-start-1), &chr, 0)) goto store; } @@ -5598,7 +5597,7 @@ } else { WRITECHAR('\\'); - WRITECHAR((unsigned char)s[-1]); + WRITECHAR(s[-1]); } break; } diff -r d8c2ce63f5a4 -r 297b3529876a PC/_msi.c --- a/PC/_msi.c Fri Jan 25 23:53:29 2013 +0200 +++ b/PC/_msi.c Fri Jan 25 22:52:26 2013 +0100 @@ -55,7 +55,7 @@ static FNFCIOPEN(cb_open) { - int result = _open(pszFile, oflag, pmode); + int result = _open(pszFile, oflag | O_NOINHERIT, pmode); if (result == -1) *err = errno; return result; @@ -179,7 +179,7 @@ CloseHandle(handle); - return _open(pszName, _O_RDONLY | _O_BINARY); + return _open(pszName, _O_RDONLY | _O_BINARY | O_NOINHERIT); } static PyObject* fcicreate(PyObject* obj, PyObject* args) diff -r d8c2ce63f5a4 -r 297b3529876a PC/launcher.c --- a/PC/launcher.c Fri Jan 25 23:53:29 2013 +0200 +++ b/PC/launcher.c Fri Jan 25 22:52:26 2013 +0100 @@ -535,7 +535,7 @@ error(RC_CREATE_PROCESS, L"Unable to create process using '%s'", cmdline); AssignProcessToJobObject(job, pi.hProcess); CloseHandle(pi.hThread); - WaitForSingleObjectEx(pi.hProcess, INFINITE, FALSE); + WaitForSingleObject(pi.hProcess, INFINITE); ok = GetExitCodeProcess(pi.hProcess, &rc); if (!ok) error(RC_CREATE_PROCESS, L"Failed to get exit code of process"); diff -r d8c2ce63f5a4 -r 297b3529876a PC/pyconfig.h --- a/PC/pyconfig.h Fri Jan 25 23:53:29 2013 +0200 +++ b/PC/pyconfig.h Fri Jan 25 22:52:26 2013 +0100 @@ -156,9 +156,15 @@ #endif /* MS_WIN64 */ /* set the version macros for the windows headers */ -/* Python 3.4+ requires Windows XP or greater */ +#ifdef MS_WINX64 +/* 64 bit only runs on XP or greater */ #define Py_WINVER 0x0501 /* _WIN32_WINNT_WINXP */ #define Py_NTDDI NTDDI_WINXP +#else +/* Python 2.6+ requires Windows 2000 or greater */ +#define Py_WINVER 0x0500 /* _WIN32_WINNT_WIN2K */ +#define Py_NTDDI NTDDI_WIN2KSP4 +#endif /* We only set these values when building Python - we don't want to force these values on extensions, as that will affect the prototypes and diff -r d8c2ce63f5a4 -r 297b3529876a PCbuild/build_tkinter.py --- a/PCbuild/build_tkinter.py Fri Jan 25 23:53:29 2013 +0200 +++ b/PCbuild/build_tkinter.py Fri Jan 25 22:52:26 2013 +0100 @@ -16,7 +16,11 @@ TIX = "tix-8.4.3.x" ROOT = os.path.abspath(os.path.join(here, par, par)) -NMAKE = ('nmake /nologo /f %s %s %s') +# Windows 2000 compatibility: WINVER 0x0500 +# http://msdn2.microsoft.com/en-us/library/aa383745.aspx +NMAKE = ('nmake /nologo /f %s ' + 'COMPILERFLAGS=\"-DWINVER=0x0500 -D_WIN32_WINNT=0x0500 -DNTDDI_VERSION=NTDDI_WIN2KSP4\" ' + '%s %s') def nmake(makefile, command="", **kw): defines = ' '.join(k+'='+str(v) for k, v in kw.items()) diff -r d8c2ce63f5a4 -r 297b3529876a PEP-433.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PEP-433.txt Fri Jan 25 22:52:26 2013 +0100 @@ -0,0 +1,51 @@ ++++++++++++++++++++++++++++++ +Implementation of the PEP 433 ++++++++++++++++++++++++++++++ + +Status +====== + +Add cloexec parameter: + + * open(): os.fdopen() is indirectly modified + * os.dup(), os.dup2() + * os.pipe() + * socket.socket(), socket.socketpair(), socket.socket.accept() + * os.open(), os.openpty() + +Set cloexec: + + * Python/random.c: os.urandom() (on UNIX) + * curses.window.getwin(), curses.window.putwin() + * oss.open() + * Modules/main.c: RunStartupFile() + * Python/pythonrun.c: PyRun_SimpleFileExFlags() + * Modules/zipimport.c: read_directory() + * Modules/_ssl.c: load_dh_params() + * PC/getpathp.c: calculate_path() + * Python/errors.c: PyErr_ProgramText() + * Python/import.c: imp_load_dynamic() + + +TODO +==== + +os.set_cloexec(): support Windows socket handle + +Add cloexec parameter to: + + * select.devpoll(): open("/dev/poll", O_RDWR); + * select.poll() + * select.epoll(): + + - self->epfd = epoll_create1(flags): use EPOLL_CLOEXEC + - self->epfd = epoll_create(sizehint): _Py_set_cloexec() + + * select.kqueue(): self->kqfd = kqueue(); + + +Notes +===== + +distutils was not modified. + diff -r d8c2ce63f5a4 -r 297b3529876a Parser/myreadline.c --- a/Parser/myreadline.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Parser/myreadline.c Fri Jan 25 22:52:26 2013 +0100 @@ -68,7 +68,7 @@ */ if (GetLastError()==ERROR_OPERATION_ABORTED) { hInterruptEvent = _PyOS_SigintEvent(); - switch (WaitForSingleObjectEx(hInterruptEvent, 10, FALSE)) { + switch (WaitForSingleObject(hInterruptEvent, 10)) { case WAIT_OBJECT_0: ResetEvent(hInterruptEvent); return 1; /* Interrupt */ diff -r d8c2ce63f5a4 -r 297b3529876a Parser/tokenizer.c --- a/Parser/tokenizer.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Parser/tokenizer.c Fri Jan 25 22:52:26 2013 +0100 @@ -1722,6 +1722,10 @@ if (fd < 0) { return NULL; } +#ifndef PGEN + _Py_try_set_default_cloexec(fd); +#endif + fp = fdopen(fd, "r"); if (fp == NULL) { return NULL; diff -r d8c2ce63f5a4 -r 297b3529876a Python/ceval.c --- a/Python/ceval.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Python/ceval.c Fri Jan 25 22:52:26 2013 +0100 @@ -1277,7 +1277,8 @@ /* line-by-line tracing support */ if (_Py_TracingPossible && - tstate->c_tracefunc != NULL && !tstate->tracing) { + tstate->c_tracefunc != NULL && !tstate->tracing && + f->f_trace != NULL) { int err; /* see maybe_call_line_trace for expository comments */ @@ -3008,7 +3009,7 @@ /* Log traceback info. */ PyTraceBack_Here(f); - if (tstate->c_tracefunc != NULL) + if (tstate->c_tracefunc != NULL && f->f_trace != NULL) call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, f); fast_block_end: @@ -3127,7 +3128,7 @@ } if (tstate->use_tracing) { - if (tstate->c_tracefunc) { + if (tstate->c_tracefunc && f->f_trace != NULL) { if (why == WHY_RETURN || why == WHY_YIELD) { if (call_trace(tstate->c_tracefunc, tstate->c_traceobj, f, diff -r d8c2ce63f5a4 -r 297b3529876a Python/condvar.h --- a/Python/condvar.h Fri Jan 25 23:53:29 2013 +0200 +++ b/Python/condvar.h Fri Jan 25 22:52:26 2013 +0100 @@ -242,7 +242,7 @@ * but we are safe because we are using a semaphore wich has an internal * count. */ - wait = WaitForSingleObjectEx(cv->sem, ms, FALSE); + wait = WaitForSingleObject(cv->sem, ms); PyMUTEX_LOCK(cs); if (wait != WAIT_OBJECT_0) --cv->waiting; diff -r d8c2ce63f5a4 -r 297b3529876a Python/errors.c --- a/Python/errors.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Python/errors.c Fri Jan 25 22:52:26 2013 +0100 @@ -2,6 +2,7 @@ /* Error handling */ #include "Python.h" +#include #ifndef __STDC__ #ifndef MS_WINDOWS @@ -941,13 +942,17 @@ PyObject * PyErr_ProgramText(const char *filename, int lineno) { + int fd; FILE *fp; int i; char linebuf[1000]; if (filename == NULL || *filename == '\0' || lineno <= 0) return NULL; - fp = fopen(filename, "r" PY_STDIOTEXTMODE); + fd = _Py_open(filename, O_RDONLY); + if (fd < 0) + return NULL; + fp = fdopen(fd, "r" PY_STDIOTEXTMODE); if (fp == NULL) return NULL; for (i = 0; i < lineno; i++) { diff -r d8c2ce63f5a4 -r 297b3529876a Python/fileutils.c --- a/Python/fileutils.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Python/fileutils.c Fri Jan 25 22:52:26 2013 +0100 @@ -9,10 +9,20 @@ #include #endif +#if defined(HAVE_SYS_IOCTL_H) +# include +#endif + +#ifdef HAVE_FCNTL_H +#include +#endif /* HAVE_FCNTL_H */ + #ifdef __APPLE__ extern wchar_t* _Py_DecodeUTF8_surrogateescape(const char *s, Py_ssize_t size); #endif +int Py_DefaultCloexec = 0; + PyObject * _Py_device_encoding(int fd) { @@ -547,14 +557,236 @@ #endif +/* Get the close-on-exec flag of the specified file descriptor. + Return 1 if it is set, 0 if is not set, + raise an exception and return -1 on error. */ +int +_Py_get_cloexec(int fd) +{ +#ifdef MS_WINDOWS + HANDLE handle; + BOOL success; + DWORD flags; + + if (!_PyVerify_fd(fd)) + handle = INVALID_HANDLE_VALUE; + else + handle = (HANDLE)_get_osfhandle(fd); + if (handle == INVALID_HANDLE_VALUE) { + PyErr_SetFromWindowsErr(0); + return -1; + } + + success = GetHandleInformation(handle, &flags); + if (!success) { + PyErr_SetFromWindowsErr(0); + return -1; + } + + return !(flags & HANDLE_FLAG_INHERIT); +#else + int flags; + + flags = fcntl(fd, F_GETFD, 0); + if (flags == -1) { + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + return (flags & FD_CLOEXEC); +#endif +} + +static int +set_cloexec(int fd, int cloexec, int raise) +{ +#ifdef MS_WINDOWS + HANDLE handle; + DWORD flags; + BOOL success; +#elif defined(HAVE_SYS_IOCTL_H) && defined(FIOCLEX) && defined(FIONCLEX) + int request; + int err; +#elif defined(HAVE_FCNTL_H) + int flags; + int res; +#endif + +#ifdef MS_WINDOWS + if (!_PyVerify_fd(fd)) + handle = INVALID_HANDLE_VALUE; + else + handle = (HANDLE)_get_osfhandle(fd); + if (handle == INVALID_HANDLE_VALUE) { + if (raise) + PyErr_SetFromWindowsErr(0); + return -1; + } + + if (cloexec) + flags = 0; + else + flags = HANDLE_FLAG_INHERIT; + success = SetHandleInformation(handle, HANDLE_FLAG_INHERIT, flags); + if (!success) { + if (raise) + PyErr_SetFromWindowsErr(0); + return -1; + } + return 0; +#elif defined(HAVE_SYS_IOCTL_H) && defined(FIOCLEX) && defined(FIONCLEX) + if (cloexec) + request = FIOCLEX; + else + request = FIONCLEX; + err = ioctl(fd, request); + if (err) { + if (raise) + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + return 0; +#elif defined(HAVE_FCNTL_H) + flags = fcntl(fd, F_GETFD); + if (flags < 0) { + if (raise) + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + + if (cloexec) + flags |= FD_CLOEXEC; + else + flags &= ~FD_CLOEXEC; + res = fcntl(fd, F_SETFD, flags); + if (res < 0) { + if (raise) + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + return 0; +#else + if (raise) + PyErr_SetString(PyExc_NotImplementedError, + "close-on-exec flag is not supported on your platform"); + return -1; +#endif +} + +/* Set or clear close-on-exec flag of the specified file descriptor. + On success: return 0, on error: raise an exception if raise is nonzero + and return -1. */ +int +_Py_set_cloexec(int fd, int cloexec, int *atomic_flags_works) +{ + if (atomic_flags_works != NULL) { + if (*atomic_flags_works == -1) { + int works = _Py_get_cloexec(fd); + if (works == -1) + return -1; + *atomic_flags_works = works; + } + + if (*atomic_flags_works) + return 0; + } + + return set_cloexec(fd, cloexec, 1); +} + +/* Try to set close-on-exec flag of the specified file descriptor. + If setting the close-on-exec flag failed, ignore the error. */ +void +_Py_try_set_cloexec(int fd, int cloexec) +{ + (void)set_cloexec(fd, cloexec, 0); +} + +/* Try to set the default value of the close-on-exec flag of the specified file + descriptor. If setting or clearing the close-on-exec flag failed, ignore the + error. + + The function considers that the close-on-exec flag is not set on the + specified file descriptor. */ +void +_Py_try_set_default_cloexec(int fd) +{ + if (!Py_DefaultCloexec) { + /* close-on-exec flag is cleared by default */ + return; + } + (void)set_cloexec(fd, 1, 0); +} + +static int +open_cloexec(const char *pathname, int flags, int cloexec) +{ + int fd; +#ifdef O_CLOEXEC + static int cloexec_works = -1; +#endif + + if (!cloexec) + return open(pathname, flags); + +#ifdef MS_WINDOWS + flags |= O_NOINHERIT; +#elif defined(O_CLOEXEC) + flags |= O_CLOEXEC; +#endif + fd = open(pathname, flags); + if (fd < 0) + return fd; + +#if defined(O_CLOEXEC) && !defined(MS_WINDOWS) + if (cloexec_works == -1) { + int flags = fcntl(fd, F_GETFD, 0); + if (flags != -1) + cloexec_works = (flags & FD_CLOEXEC); + else + cloexec_works = 0; + } + + if (!cloexec_works) { + /* Linux kernel older than 2.6.23 ignores O_CLOEXEC flag */ + (void)set_cloexec(fd, 1, 0); + } +#elif !defined(MS_WINDOWS) + (void)set_cloexec(fd, 1, 0); +#endif + return fd; +} + +/* Open a file with the specified flags (wrapper to open() function). + + Try to apply the default value of the close-on-exec flag on the newly + created file descriptor. If setting the close-on-exec flag failed, ignore + the error. */ +int +_Py_open(const char *pathname, int flags) +{ + return open_cloexec(pathname, flags, Py_DefaultCloexec); +} + +/* Open a file with the specified flags (wrapper to open() function). + + Try to set close-on-exec flag of the newly created file descriptor. + If setting the close-on-exec flag failed, ignore the error. */ +int +_Py_open_cloexec(const char *pathname, int flags) +{ + return open_cloexec(pathname, flags, 1); +} + /* Open a file. Use _wfopen() on Windows, encode the path to the locale - encoding and use fopen() otherwise. */ + encoding and use fopen() otherwise. + Try to set close-on-exec flag of the newly created file descriptor. + If setting the close-on-exec flag failed, ignore the error. */ FILE * _Py_wfopen(const wchar_t *path, const wchar_t *mode) { + FILE *f; #ifndef MS_WINDOWS - FILE *f; char *cpath; char cmode[10]; size_t r; @@ -570,19 +802,27 @@ PyMem_Free(cpath); return f; #else - return _wfopen(path, mode); + f = _wfopen(path, mode); #endif + if (f == NULL) + return NULL; + if (Py_DefaultCloexec) + (void)set_cloexec(fileno(f), 1, 0); + return f; } -/* Call _wfopen() on Windows, or encode the path to the filesystem encoding and - call fopen() otherwise. +/* Open a file. Call _wfopen() on Windows, or encode the path to the filesystem + encoding and call fopen() otherwise. + + Try to set close-on-exec flag of the newly created file descriptor. + If setting the close-on-exec flag failed, ignore the error. Return the new file object on success, or NULL if the file cannot be open or - (if PyErr_Occurred()) on unicode error */ - + (if PyErr_Occurred()) on unicode error. */ FILE* _Py_fopen(PyObject *path, const char *mode) { + FILE *f; #ifdef MS_WINDOWS wchar_t *wpath; wchar_t wmode[10]; @@ -602,16 +842,19 @@ if (usize == 0) return NULL; - return _wfopen(wpath, wmode); + f = _wfopen(wpath, wmode); #else - FILE *f; PyObject *bytes; if (!PyUnicode_FSConverter(path, &bytes)) return NULL; f = fopen(PyBytes_AS_STRING(bytes), mode); Py_DECREF(bytes); +#endif + if (f == NULL) + return NULL; + if (Py_DefaultCloexec) + (void)set_cloexec(fileno(f), 1, 0); return f; -#endif } #ifdef HAVE_READLINK @@ -728,3 +971,26 @@ #endif } +/* Converter for PyArg_ParseTuple() to parse the 'cloexec' parameter: + + - if the argument is None, return sys.getdefaultcloexec() + - otherwise, return bool(argument) + + Return 0 on error, 1 on success. +*/ +int +_Py_cloexec_converter(PyObject* arg, void* addr) +{ + int cloexec; + if (arg == Py_None) { + cloexec = Py_DefaultCloexec; + } + else { + cloexec = PyObject_IsTrue(arg); + if (cloexec == -1) + return 0; + } + *(int *)addr = cloexec; + return 1; +} + diff -r d8c2ce63f5a4 -r 297b3529876a Python/import.c --- a/Python/import.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Python/import.c Fri Jan 25 22:52:26 2013 +0100 @@ -1807,6 +1807,7 @@ PyErr_SetFromErrno(PyExc_IOError); return NULL; } + _Py_try_set_cloexec(fileno(fp), 1); } else fp = NULL; diff -r d8c2ce63f5a4 -r 297b3529876a Python/importlib.h --- a/Python/importlib.h Fri Jan 25 23:53:29 2013 +0200 +++ b/Python/importlib.h Fri Jan 25 22:52:26 2013 +0100 @@ -283,1141 +283,1141 @@ 0,0,115,6,0,0,0,0,2,6,1,15,1,117,11,0, 0,0,95,112,97,116,104,95,105,115,100,105,114,105,182,1, 0,0,99,3,0,0,0,0,0,0,0,6,0,0,0,17, - 0,0,0,67,0,0,0,115,192,0,0,0,100,1,0,106, + 0,0,0,67,0,0,0,115,198,0,0,0,100,1,0,106, 0,0,124,0,0,116,1,0,124,0,0,131,1,0,131,2, 0,125,3,0,116,2,0,106,3,0,124,3,0,116,2,0, 106,4,0,116,2,0,106,5,0,66,116,2,0,106,6,0, - 66,124,2,0,100,2,0,64,131,3,0,125,4,0,121,60, - 0,116,7,0,106,8,0,124,4,0,100,3,0,131,2,0, - 143,20,0,125,5,0,124,5,0,106,9,0,124,1,0,131, - 1,0,1,87,100,4,0,81,88,116,2,0,106,10,0,124, - 3,0,124,0,0,131,2,0,1,87,110,59,0,4,116,11, - 0,107,10,0,114,187,0,1,1,1,121,17,0,116,2,0, - 106,12,0,124,3,0,131,1,0,1,87,110,18,0,4,116, - 11,0,107,10,0,114,179,0,1,1,1,89,110,1,0,88, - 130,0,0,89,110,1,0,88,100,4,0,83,40,5,0,0, - 0,117,162,0,0,0,66,101,115,116,45,101,102,102,111,114, - 116,32,102,117,110,99,116,105,111,110,32,116,111,32,119,114, - 105,116,101,32,100,97,116,97,32,116,111,32,97,32,112,97, - 116,104,32,97,116,111,109,105,99,97,108,108,121,46,10,32, - 32,32,32,66,101,32,112,114,101,112,97,114,101,100,32,116, - 111,32,104,97,110,100,108,101,32,97,32,70,105,108,101,69, - 120,105,115,116,115,69,114,114,111,114,32,105,102,32,99,111, - 110,99,117,114,114,101,110,116,32,119,114,105,116,105,110,103, - 32,111,102,32,116,104,101,10,32,32,32,32,116,101,109,112, - 111,114,97,114,121,32,102,105,108,101,32,105,115,32,97,116, - 116,101,109,112,116,101,100,46,117,5,0,0,0,123,125,46, - 123,125,105,182,1,0,0,117,2,0,0,0,119,98,78,40, - 13,0,0,0,117,6,0,0,0,102,111,114,109,97,116,117, - 2,0,0,0,105,100,117,3,0,0,0,95,111,115,117,4, - 0,0,0,111,112,101,110,117,6,0,0,0,79,95,69,88, - 67,76,117,7,0,0,0,79,95,67,82,69,65,84,117,8, - 0,0,0,79,95,87,82,79,78,76,89,117,3,0,0,0, - 95,105,111,117,6,0,0,0,70,105,108,101,73,79,117,5, - 0,0,0,119,114,105,116,101,117,7,0,0,0,114,101,112, - 108,97,99,101,117,7,0,0,0,79,83,69,114,114,111,114, - 117,6,0,0,0,117,110,108,105,110,107,40,6,0,0,0, - 117,4,0,0,0,112,97,116,104,117,4,0,0,0,100,97, - 116,97,117,4,0,0,0,109,111,100,101,117,8,0,0,0, - 112,97,116,104,95,116,109,112,117,2,0,0,0,102,100,117, - 4,0,0,0,102,105,108,101,40,0,0,0,0,40,0,0, + 66,124,2,0,100,2,0,64,100,3,0,100,4,0,131,3, + 1,125,4,0,121,60,0,116,7,0,106,8,0,124,4,0, + 100,5,0,131,2,0,143,20,0,125,5,0,124,5,0,106, + 9,0,124,1,0,131,1,0,1,87,100,6,0,81,88,116, + 2,0,106,10,0,124,3,0,124,0,0,131,2,0,1,87, + 110,59,0,4,116,11,0,107,10,0,114,193,0,1,1,1, + 121,17,0,116,2,0,106,12,0,124,3,0,131,1,0,1, + 87,110,18,0,4,116,11,0,107,10,0,114,185,0,1,1, + 1,89,110,1,0,88,130,0,0,89,110,1,0,88,100,6, + 0,83,40,7,0,0,0,117,162,0,0,0,66,101,115,116, + 45,101,102,102,111,114,116,32,102,117,110,99,116,105,111,110, + 32,116,111,32,119,114,105,116,101,32,100,97,116,97,32,116, + 111,32,97,32,112,97,116,104,32,97,116,111,109,105,99,97, + 108,108,121,46,10,32,32,32,32,66,101,32,112,114,101,112, + 97,114,101,100,32,116,111,32,104,97,110,100,108,101,32,97, + 32,70,105,108,101,69,120,105,115,116,115,69,114,114,111,114, + 32,105,102,32,99,111,110,99,117,114,114,101,110,116,32,119, + 114,105,116,105,110,103,32,111,102,32,116,104,101,10,32,32, + 32,32,116,101,109,112,111,114,97,114,121,32,102,105,108,101, + 32,105,115,32,97,116,116,101,109,112,116,101,100,46,117,5, + 0,0,0,123,125,46,123,125,105,182,1,0,0,117,7,0, + 0,0,99,108,111,101,120,101,99,84,117,2,0,0,0,119, + 98,78,40,13,0,0,0,117,6,0,0,0,102,111,114,109, + 97,116,117,2,0,0,0,105,100,117,3,0,0,0,95,111, + 115,117,4,0,0,0,111,112,101,110,117,6,0,0,0,79, + 95,69,88,67,76,117,7,0,0,0,79,95,67,82,69,65, + 84,117,8,0,0,0,79,95,87,82,79,78,76,89,117,3, + 0,0,0,95,105,111,117,6,0,0,0,70,105,108,101,73, + 79,117,5,0,0,0,119,114,105,116,101,117,7,0,0,0, + 114,101,112,108,97,99,101,117,7,0,0,0,79,83,69,114, + 114,111,114,117,6,0,0,0,117,110,108,105,110,107,40,6, + 0,0,0,117,4,0,0,0,112,97,116,104,117,4,0,0, + 0,100,97,116,97,117,4,0,0,0,109,111,100,101,117,8, + 0,0,0,112,97,116,104,95,116,109,112,117,2,0,0,0, + 102,100,117,4,0,0,0,102,105,108,101,40,0,0,0,0, + 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, + 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, + 116,115,116,114,97,112,62,117,13,0,0,0,95,119,114,105, + 116,101,95,97,116,111,109,105,99,121,0,0,0,115,30,0, + 0,0,0,5,24,1,9,1,20,1,10,1,9,1,3,3, + 21,1,19,1,20,1,13,1,3,1,17,1,13,1,5,1, + 117,13,0,0,0,95,119,114,105,116,101,95,97,116,111,109, + 105,99,99,2,0,0,0,0,0,0,0,3,0,0,0,7, + 0,0,0,67,0,0,0,115,95,0,0,0,120,69,0,100, + 1,0,100,2,0,100,3,0,100,4,0,103,4,0,68,93, + 49,0,125,2,0,116,0,0,124,1,0,124,2,0,131,2, + 0,114,19,0,116,1,0,124,0,0,124,2,0,116,2,0, + 124,1,0,124,2,0,131,2,0,131,3,0,1,113,19,0, + 113,19,0,87,124,0,0,106,3,0,106,4,0,124,1,0, + 106,3,0,131,1,0,1,100,5,0,83,40,6,0,0,0, + 117,47,0,0,0,83,105,109,112,108,101,32,115,117,98,115, + 116,105,116,117,116,101,32,102,111,114,32,102,117,110,99,116, + 111,111,108,115,46,117,112,100,97,116,101,95,119,114,97,112, + 112,101,114,46,117,10,0,0,0,95,95,109,111,100,117,108, + 101,95,95,117,8,0,0,0,95,95,110,97,109,101,95,95, + 117,12,0,0,0,95,95,113,117,97,108,110,97,109,101,95, + 95,117,7,0,0,0,95,95,100,111,99,95,95,78,40,5, + 0,0,0,117,7,0,0,0,104,97,115,97,116,116,114,117, + 7,0,0,0,115,101,116,97,116,116,114,117,7,0,0,0, + 103,101,116,97,116,116,114,117,8,0,0,0,95,95,100,105, + 99,116,95,95,117,6,0,0,0,117,112,100,97,116,101,40, + 3,0,0,0,117,3,0,0,0,110,101,119,117,3,0,0, + 0,111,108,100,117,7,0,0,0,114,101,112,108,97,99,101, + 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, + 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, + 46,95,98,111,111,116,115,116,114,97,112,62,117,5,0,0, + 0,95,119,114,97,112,145,0,0,0,115,8,0,0,0,0, + 2,25,1,15,1,32,1,117,5,0,0,0,95,119,114,97, + 112,99,1,0,0,0,0,0,0,0,1,0,0,0,2,0, + 0,0,67,0,0,0,115,16,0,0,0,116,0,0,116,1, + 0,131,1,0,124,0,0,131,1,0,83,40,1,0,0,0, + 117,75,0,0,0,67,114,101,97,116,101,32,97,32,110,101, + 119,32,109,111,100,117,108,101,46,10,10,32,32,32,32,84, + 104,101,32,109,111,100,117,108,101,32,105,115,32,110,111,116, + 32,101,110,116,101,114,101,100,32,105,110,116,111,32,115,121, + 115,46,109,111,100,117,108,101,115,46,10,10,32,32,32,32, + 40,2,0,0,0,117,4,0,0,0,116,121,112,101,117,3, + 0,0,0,95,105,111,40,1,0,0,0,117,4,0,0,0, + 110,97,109,101,40,0,0,0,0,40,0,0,0,0,117,29, + 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, + 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, + 117,10,0,0,0,110,101,119,95,109,111,100,117,108,101,156, + 0,0,0,115,2,0,0,0,0,6,117,10,0,0,0,110, + 101,119,95,109,111,100,117,108,101,99,1,0,0,0,0,0, + 0,0,1,0,0,0,1,0,0,0,66,0,0,0,115,20, + 0,0,0,124,0,0,69,101,0,0,90,1,0,100,0,0, + 90,2,0,100,1,0,83,40,2,0,0,0,117,14,0,0, + 0,95,68,101,97,100,108,111,99,107,69,114,114,111,114,78, + 40,3,0,0,0,117,8,0,0,0,95,95,110,97,109,101, + 95,95,117,10,0,0,0,95,95,109,111,100,117,108,101,95, + 95,117,12,0,0,0,95,95,113,117,97,108,110,97,109,101, + 95,95,40,1,0,0,0,117,10,0,0,0,95,95,108,111, + 99,97,108,115,95,95,40,0,0,0,0,40,0,0,0,0, + 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, + 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, + 112,62,117,14,0,0,0,95,68,101,97,100,108,111,99,107, + 69,114,114,111,114,173,0,0,0,115,2,0,0,0,16,1, + 117,14,0,0,0,95,68,101,97,100,108,111,99,107,69,114, + 114,111,114,99,1,0,0,0,0,0,0,0,1,0,0,0, + 2,0,0,0,66,0,0,0,115,86,0,0,0,124,0,0, + 69,101,0,0,90,1,0,100,0,0,90,2,0,100,1,0, + 90,3,0,100,2,0,100,3,0,132,0,0,90,4,0,100, + 4,0,100,5,0,132,0,0,90,5,0,100,6,0,100,7, + 0,132,0,0,90,6,0,100,8,0,100,9,0,132,0,0, + 90,7,0,100,10,0,100,11,0,132,0,0,90,8,0,100, + 12,0,83,40,13,0,0,0,117,11,0,0,0,95,77,111, + 100,117,108,101,76,111,99,107,117,169,0,0,0,65,32,114, + 101,99,117,114,115,105,118,101,32,108,111,99,107,32,105,109, + 112,108,101,109,101,110,116,97,116,105,111,110,32,119,104,105, + 99,104,32,105,115,32,97,98,108,101,32,116,111,32,100,101, + 116,101,99,116,32,100,101,97,100,108,111,99,107,115,10,32, + 32,32,32,40,101,46,103,46,32,116,104,114,101,97,100,32, + 49,32,116,114,121,105,110,103,32,116,111,32,116,97,107,101, + 32,108,111,99,107,115,32,65,32,116,104,101,110,32,66,44, + 32,97,110,100,32,116,104,114,101,97,100,32,50,32,116,114, + 121,105,110,103,32,116,111,10,32,32,32,32,116,97,107,101, + 32,108,111,99,107,115,32,66,32,116,104,101,110,32,65,41, + 46,10,32,32,32,32,99,2,0,0,0,0,0,0,0,2, + 0,0,0,2,0,0,0,67,0,0,0,115,70,0,0,0, + 116,0,0,106,1,0,131,0,0,124,0,0,95,2,0,116, + 0,0,106,1,0,131,0,0,124,0,0,95,3,0,124,1, + 0,124,0,0,95,4,0,100,0,0,124,0,0,95,5,0, + 100,1,0,124,0,0,95,6,0,100,1,0,124,0,0,95, + 7,0,100,0,0,83,40,2,0,0,0,78,105,0,0,0, + 0,40,8,0,0,0,117,7,0,0,0,95,116,104,114,101, + 97,100,117,13,0,0,0,97,108,108,111,99,97,116,101,95, + 108,111,99,107,117,4,0,0,0,108,111,99,107,117,6,0, + 0,0,119,97,107,101,117,112,117,4,0,0,0,110,97,109, + 101,117,5,0,0,0,111,119,110,101,114,117,5,0,0,0, + 99,111,117,110,116,117,7,0,0,0,119,97,105,116,101,114, + 115,40,2,0,0,0,117,4,0,0,0,115,101,108,102,117, + 4,0,0,0,110,97,109,101,40,0,0,0,0,40,0,0, 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, - 114,97,112,62,117,13,0,0,0,95,119,114,105,116,101,95, - 97,116,111,109,105,99,121,0,0,0,115,26,0,0,0,0, - 5,24,1,9,1,33,1,3,3,21,1,19,1,20,1,13, - 1,3,1,17,1,13,1,5,1,117,13,0,0,0,95,119, - 114,105,116,101,95,97,116,111,109,105,99,99,2,0,0,0, - 0,0,0,0,3,0,0,0,7,0,0,0,67,0,0,0, - 115,95,0,0,0,120,69,0,100,1,0,100,2,0,100,3, - 0,100,4,0,103,4,0,68,93,49,0,125,2,0,116,0, - 0,124,1,0,124,2,0,131,2,0,114,19,0,116,1,0, - 124,0,0,124,2,0,116,2,0,124,1,0,124,2,0,131, - 2,0,131,3,0,1,113,19,0,113,19,0,87,124,0,0, - 106,3,0,106,4,0,124,1,0,106,3,0,131,1,0,1, - 100,5,0,83,40,6,0,0,0,117,47,0,0,0,83,105, - 109,112,108,101,32,115,117,98,115,116,105,116,117,116,101,32, - 102,111,114,32,102,117,110,99,116,111,111,108,115,46,117,112, - 100,97,116,101,95,119,114,97,112,112,101,114,46,117,10,0, - 0,0,95,95,109,111,100,117,108,101,95,95,117,8,0,0, - 0,95,95,110,97,109,101,95,95,117,12,0,0,0,95,95, - 113,117,97,108,110,97,109,101,95,95,117,7,0,0,0,95, - 95,100,111,99,95,95,78,40,5,0,0,0,117,7,0,0, - 0,104,97,115,97,116,116,114,117,7,0,0,0,115,101,116, - 97,116,116,114,117,7,0,0,0,103,101,116,97,116,116,114, - 117,8,0,0,0,95,95,100,105,99,116,95,95,117,6,0, - 0,0,117,112,100,97,116,101,40,3,0,0,0,117,3,0, - 0,0,110,101,119,117,3,0,0,0,111,108,100,117,7,0, - 0,0,114,101,112,108,97,99,101,40,0,0,0,0,40,0, - 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, - 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, - 116,114,97,112,62,117,5,0,0,0,95,119,114,97,112,143, - 0,0,0,115,8,0,0,0,0,2,25,1,15,1,32,1, - 117,5,0,0,0,95,119,114,97,112,99,1,0,0,0,0, - 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, - 16,0,0,0,116,0,0,116,1,0,131,1,0,124,0,0, - 131,1,0,83,40,1,0,0,0,117,75,0,0,0,67,114, - 101,97,116,101,32,97,32,110,101,119,32,109,111,100,117,108, - 101,46,10,10,32,32,32,32,84,104,101,32,109,111,100,117, - 108,101,32,105,115,32,110,111,116,32,101,110,116,101,114,101, - 100,32,105,110,116,111,32,115,121,115,46,109,111,100,117,108, - 101,115,46,10,10,32,32,32,32,40,2,0,0,0,117,4, - 0,0,0,116,121,112,101,117,3,0,0,0,95,105,111,40, - 1,0,0,0,117,4,0,0,0,110,97,109,101,40,0,0, - 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, - 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, - 111,111,116,115,116,114,97,112,62,117,10,0,0,0,110,101, - 119,95,109,111,100,117,108,101,154,0,0,0,115,2,0,0, - 0,0,6,117,10,0,0,0,110,101,119,95,109,111,100,117, - 108,101,99,1,0,0,0,0,0,0,0,1,0,0,0,1, - 0,0,0,66,0,0,0,115,20,0,0,0,124,0,0,69, - 101,0,0,90,1,0,100,0,0,90,2,0,100,1,0,83, - 40,2,0,0,0,117,14,0,0,0,95,68,101,97,100,108, - 111,99,107,69,114,114,111,114,78,40,3,0,0,0,117,8, - 0,0,0,95,95,110,97,109,101,95,95,117,10,0,0,0, - 95,95,109,111,100,117,108,101,95,95,117,12,0,0,0,95, - 95,113,117,97,108,110,97,109,101,95,95,40,1,0,0,0, - 117,10,0,0,0,95,95,108,111,99,97,108,115,95,95,40, - 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, - 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, - 95,98,111,111,116,115,116,114,97,112,62,117,14,0,0,0, - 95,68,101,97,100,108,111,99,107,69,114,114,111,114,171,0, - 0,0,115,2,0,0,0,16,1,117,14,0,0,0,95,68, - 101,97,100,108,111,99,107,69,114,114,111,114,99,1,0,0, - 0,0,0,0,0,1,0,0,0,2,0,0,0,66,0,0, - 0,115,86,0,0,0,124,0,0,69,101,0,0,90,1,0, - 100,0,0,90,2,0,100,1,0,90,3,0,100,2,0,100, - 3,0,132,0,0,90,4,0,100,4,0,100,5,0,132,0, - 0,90,5,0,100,6,0,100,7,0,132,0,0,90,6,0, - 100,8,0,100,9,0,132,0,0,90,7,0,100,10,0,100, - 11,0,132,0,0,90,8,0,100,12,0,83,40,13,0,0, - 0,117,11,0,0,0,95,77,111,100,117,108,101,76,111,99, - 107,117,169,0,0,0,65,32,114,101,99,117,114,115,105,118, - 101,32,108,111,99,107,32,105,109,112,108,101,109,101,110,116, - 97,116,105,111,110,32,119,104,105,99,104,32,105,115,32,97, - 98,108,101,32,116,111,32,100,101,116,101,99,116,32,100,101, - 97,100,108,111,99,107,115,10,32,32,32,32,40,101,46,103, - 46,32,116,104,114,101,97,100,32,49,32,116,114,121,105,110, - 103,32,116,111,32,116,97,107,101,32,108,111,99,107,115,32, - 65,32,116,104,101,110,32,66,44,32,97,110,100,32,116,104, - 114,101,97,100,32,50,32,116,114,121,105,110,103,32,116,111, - 10,32,32,32,32,116,97,107,101,32,108,111,99,107,115,32, - 66,32,116,104,101,110,32,65,41,46,10,32,32,32,32,99, - 2,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0, - 67,0,0,0,115,70,0,0,0,116,0,0,106,1,0,131, - 0,0,124,0,0,95,2,0,116,0,0,106,1,0,131,0, - 0,124,0,0,95,3,0,124,1,0,124,0,0,95,4,0, - 100,0,0,124,0,0,95,5,0,100,1,0,124,0,0,95, - 6,0,100,1,0,124,0,0,95,7,0,100,0,0,83,40, - 2,0,0,0,78,105,0,0,0,0,40,8,0,0,0,117, - 7,0,0,0,95,116,104,114,101,97,100,117,13,0,0,0, - 97,108,108,111,99,97,116,101,95,108,111,99,107,117,4,0, - 0,0,108,111,99,107,117,6,0,0,0,119,97,107,101,117, - 112,117,4,0,0,0,110,97,109,101,117,5,0,0,0,111, - 119,110,101,114,117,5,0,0,0,99,111,117,110,116,117,7, - 0,0,0,119,97,105,116,101,114,115,40,2,0,0,0,117, - 4,0,0,0,115,101,108,102,117,4,0,0,0,110,97,109, - 101,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, - 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, - 98,46,95,98,111,111,116,115,116,114,97,112,62,117,8,0, - 0,0,95,95,105,110,105,116,95,95,181,0,0,0,115,12, - 0,0,0,0,1,15,1,15,1,9,1,9,1,9,1,117, - 20,0,0,0,95,77,111,100,117,108,101,76,111,99,107,46, - 95,95,105,110,105,116,95,95,99,1,0,0,0,0,0,0, - 0,4,0,0,0,2,0,0,0,67,0,0,0,115,87,0, - 0,0,116,0,0,106,1,0,131,0,0,125,1,0,124,0, - 0,106,2,0,125,2,0,120,59,0,116,3,0,106,4,0, - 124,2,0,131,1,0,125,3,0,124,3,0,100,0,0,107, - 8,0,114,55,0,100,1,0,83,124,3,0,106,2,0,125, - 2,0,124,2,0,124,1,0,107,2,0,114,24,0,100,2, - 0,83,113,24,0,100,0,0,83,40,3,0,0,0,78,70, - 84,40,5,0,0,0,117,7,0,0,0,95,116,104,114,101, - 97,100,117,9,0,0,0,103,101,116,95,105,100,101,110,116, - 117,5,0,0,0,111,119,110,101,114,117,12,0,0,0,95, - 98,108,111,99,107,105,110,103,95,111,110,117,3,0,0,0, - 103,101,116,40,4,0,0,0,117,4,0,0,0,115,101,108, - 102,117,2,0,0,0,109,101,117,3,0,0,0,116,105,100, - 117,4,0,0,0,108,111,99,107,40,0,0,0,0,40,0, - 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, - 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, - 116,114,97,112,62,117,12,0,0,0,104,97,115,95,100,101, - 97,100,108,111,99,107,189,0,0,0,115,18,0,0,0,0, - 2,12,1,9,1,3,1,15,1,12,1,4,1,9,1,12, - 1,117,24,0,0,0,95,77,111,100,117,108,101,76,111,99, - 107,46,104,97,115,95,100,101,97,100,108,111,99,107,99,1, - 0,0,0,0,0,0,0,2,0,0,0,17,0,0,0,67, - 0,0,0,115,214,0,0,0,116,0,0,106,1,0,131,0, - 0,125,1,0,124,0,0,116,2,0,124,1,0,60,122,177, - 0,120,170,0,124,0,0,106,3,0,143,130,0,1,124,0, - 0,106,4,0,100,1,0,107,2,0,115,68,0,124,0,0, - 106,5,0,124,1,0,107,2,0,114,96,0,124,1,0,124, - 0,0,95,5,0,124,0,0,4,106,4,0,100,2,0,55, - 2,95,4,0,100,3,0,83,124,0,0,106,6,0,131,0, - 0,114,127,0,116,7,0,100,4,0,124,0,0,22,131,1, - 0,130,1,0,110,0,0,124,0,0,106,8,0,106,9,0, - 100,5,0,131,1,0,114,163,0,124,0,0,4,106,10,0, - 100,2,0,55,2,95,10,0,110,0,0,87,100,6,0,81, - 88,124,0,0,106,8,0,106,9,0,131,0,0,1,124,0, - 0,106,8,0,106,11,0,131,0,0,1,113,28,0,87,100, - 6,0,116,2,0,124,1,0,61,88,100,6,0,83,40,7, - 0,0,0,117,185,0,0,0,10,32,32,32,32,32,32,32, - 32,65,99,113,117,105,114,101,32,116,104,101,32,109,111,100, - 117,108,101,32,108,111,99,107,46,32,32,73,102,32,97,32, - 112,111,116,101,110,116,105,97,108,32,100,101,97,100,108,111, - 99,107,32,105,115,32,100,101,116,101,99,116,101,100,44,10, - 32,32,32,32,32,32,32,32,97,32,95,68,101,97,100,108, - 111,99,107,69,114,114,111,114,32,105,115,32,114,97,105,115, - 101,100,46,10,32,32,32,32,32,32,32,32,79,116,104,101, - 114,119,105,115,101,44,32,116,104,101,32,108,111,99,107,32, - 105,115,32,97,108,119,97,121,115,32,97,99,113,117,105,114, - 101,100,32,97,110,100,32,84,114,117,101,32,105,115,32,114, - 101,116,117,114,110,101,100,46,10,32,32,32,32,32,32,32, - 32,105,0,0,0,0,105,1,0,0,0,84,117,23,0,0, - 0,100,101,97,100,108,111,99,107,32,100,101,116,101,99,116, - 101,100,32,98,121,32,37,114,70,78,40,12,0,0,0,117, - 7,0,0,0,95,116,104,114,101,97,100,117,9,0,0,0, - 103,101,116,95,105,100,101,110,116,117,12,0,0,0,95,98, - 108,111,99,107,105,110,103,95,111,110,117,4,0,0,0,108, - 111,99,107,117,5,0,0,0,99,111,117,110,116,117,5,0, - 0,0,111,119,110,101,114,117,12,0,0,0,104,97,115,95, - 100,101,97,100,108,111,99,107,117,14,0,0,0,95,68,101, - 97,100,108,111,99,107,69,114,114,111,114,117,6,0,0,0, - 119,97,107,101,117,112,117,7,0,0,0,97,99,113,117,105, - 114,101,117,7,0,0,0,119,97,105,116,101,114,115,117,7, - 0,0,0,114,101,108,101,97,115,101,40,2,0,0,0,117, - 4,0,0,0,115,101,108,102,117,3,0,0,0,116,105,100, + 114,97,112,62,117,8,0,0,0,95,95,105,110,105,116,95, + 95,183,0,0,0,115,12,0,0,0,0,1,15,1,15,1, + 9,1,9,1,9,1,117,20,0,0,0,95,77,111,100,117, + 108,101,76,111,99,107,46,95,95,105,110,105,116,95,95,99, + 1,0,0,0,0,0,0,0,4,0,0,0,2,0,0,0, + 67,0,0,0,115,87,0,0,0,116,0,0,106,1,0,131, + 0,0,125,1,0,124,0,0,106,2,0,125,2,0,120,59, + 0,116,3,0,106,4,0,124,2,0,131,1,0,125,3,0, + 124,3,0,100,0,0,107,8,0,114,55,0,100,1,0,83, + 124,3,0,106,2,0,125,2,0,124,2,0,124,1,0,107, + 2,0,114,24,0,100,2,0,83,113,24,0,100,0,0,83, + 40,3,0,0,0,78,70,84,40,5,0,0,0,117,7,0, + 0,0,95,116,104,114,101,97,100,117,9,0,0,0,103,101, + 116,95,105,100,101,110,116,117,5,0,0,0,111,119,110,101, + 114,117,12,0,0,0,95,98,108,111,99,107,105,110,103,95, + 111,110,117,3,0,0,0,103,101,116,40,4,0,0,0,117, + 4,0,0,0,115,101,108,102,117,2,0,0,0,109,101,117, + 3,0,0,0,116,105,100,117,4,0,0,0,108,111,99,107, 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, - 46,95,98,111,111,116,115,116,114,97,112,62,117,7,0,0, - 0,97,99,113,117,105,114,101,201,0,0,0,115,32,0,0, - 0,0,6,12,1,10,1,3,1,3,1,10,1,30,1,9, - 1,15,1,4,1,12,1,19,1,18,1,24,2,13,1,20, - 2,117,19,0,0,0,95,77,111,100,117,108,101,76,111,99, - 107,46,97,99,113,117,105,114,101,99,1,0,0,0,0,0, - 0,0,2,0,0,0,10,0,0,0,67,0,0,0,115,165, - 0,0,0,116,0,0,106,1,0,131,0,0,125,1,0,124, - 0,0,106,2,0,143,138,0,1,124,0,0,106,3,0,124, - 1,0,107,3,0,114,52,0,116,4,0,100,1,0,131,1, - 0,130,1,0,110,0,0,124,0,0,106,5,0,100,2,0, - 107,4,0,115,73,0,116,6,0,130,1,0,124,0,0,4, - 106,5,0,100,3,0,56,2,95,5,0,124,0,0,106,5, - 0,100,2,0,107,2,0,114,155,0,100,0,0,124,0,0, - 95,3,0,124,0,0,106,7,0,114,155,0,124,0,0,4, - 106,7,0,100,3,0,56,2,95,7,0,124,0,0,106,8, - 0,106,9,0,131,0,0,1,113,155,0,110,0,0,87,100, - 0,0,81,88,100,0,0,83,40,4,0,0,0,78,117,31, - 0,0,0,99,97,110,110,111,116,32,114,101,108,101,97,115, - 101,32,117,110,45,97,99,113,117,105,114,101,100,32,108,111, - 99,107,105,0,0,0,0,105,1,0,0,0,40,10,0,0, - 0,117,7,0,0,0,95,116,104,114,101,97,100,117,9,0, - 0,0,103,101,116,95,105,100,101,110,116,117,4,0,0,0, - 108,111,99,107,117,5,0,0,0,111,119,110,101,114,117,12, - 0,0,0,82,117,110,116,105,109,101,69,114,114,111,114,117, - 5,0,0,0,99,111,117,110,116,117,14,0,0,0,65,115, - 115,101,114,116,105,111,110,69,114,114,111,114,117,7,0,0, - 0,119,97,105,116,101,114,115,117,6,0,0,0,119,97,107, - 101,117,112,117,7,0,0,0,114,101,108,101,97,115,101,40, - 2,0,0,0,117,4,0,0,0,115,101,108,102,117,3,0, - 0,0,116,105,100,40,0,0,0,0,40,0,0,0,0,117, - 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, - 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, - 62,117,7,0,0,0,114,101,108,101,97,115,101,226,0,0, - 0,115,22,0,0,0,0,1,12,1,10,1,15,1,15,1, - 21,1,15,1,15,1,9,1,9,1,15,1,117,19,0,0, - 0,95,77,111,100,117,108,101,76,111,99,107,46,114,101,108, - 101,97,115,101,99,1,0,0,0,0,0,0,0,1,0,0, - 0,4,0,0,0,67,0,0,0,115,25,0,0,0,100,1, - 0,106,0,0,124,0,0,106,1,0,116,2,0,124,0,0, - 131,1,0,131,2,0,83,40,2,0,0,0,78,117,23,0, - 0,0,95,77,111,100,117,108,101,76,111,99,107,40,123,33, - 114,125,41,32,97,116,32,123,125,40,3,0,0,0,117,6, - 0,0,0,102,111,114,109,97,116,117,4,0,0,0,110,97, - 109,101,117,2,0,0,0,105,100,40,1,0,0,0,117,4, - 0,0,0,115,101,108,102,40,0,0,0,0,40,0,0,0, + 46,95,98,111,111,116,115,116,114,97,112,62,117,12,0,0, + 0,104,97,115,95,100,101,97,100,108,111,99,107,191,0,0, + 0,115,18,0,0,0,0,2,12,1,9,1,3,1,15,1, + 12,1,4,1,9,1,12,1,117,24,0,0,0,95,77,111, + 100,117,108,101,76,111,99,107,46,104,97,115,95,100,101,97, + 100,108,111,99,107,99,1,0,0,0,0,0,0,0,2,0, + 0,0,17,0,0,0,67,0,0,0,115,214,0,0,0,116, + 0,0,106,1,0,131,0,0,125,1,0,124,0,0,116,2, + 0,124,1,0,60,122,177,0,120,170,0,124,0,0,106,3, + 0,143,130,0,1,124,0,0,106,4,0,100,1,0,107,2, + 0,115,68,0,124,0,0,106,5,0,124,1,0,107,2,0, + 114,96,0,124,1,0,124,0,0,95,5,0,124,0,0,4, + 106,4,0,100,2,0,55,2,95,4,0,100,3,0,83,124, + 0,0,106,6,0,131,0,0,114,127,0,116,7,0,100,4, + 0,124,0,0,22,131,1,0,130,1,0,110,0,0,124,0, + 0,106,8,0,106,9,0,100,5,0,131,1,0,114,163,0, + 124,0,0,4,106,10,0,100,2,0,55,2,95,10,0,110, + 0,0,87,100,6,0,81,88,124,0,0,106,8,0,106,9, + 0,131,0,0,1,124,0,0,106,8,0,106,11,0,131,0, + 0,1,113,28,0,87,100,6,0,116,2,0,124,1,0,61, + 88,100,6,0,83,40,7,0,0,0,117,185,0,0,0,10, + 32,32,32,32,32,32,32,32,65,99,113,117,105,114,101,32, + 116,104,101,32,109,111,100,117,108,101,32,108,111,99,107,46, + 32,32,73,102,32,97,32,112,111,116,101,110,116,105,97,108, + 32,100,101,97,100,108,111,99,107,32,105,115,32,100,101,116, + 101,99,116,101,100,44,10,32,32,32,32,32,32,32,32,97, + 32,95,68,101,97,100,108,111,99,107,69,114,114,111,114,32, + 105,115,32,114,97,105,115,101,100,46,10,32,32,32,32,32, + 32,32,32,79,116,104,101,114,119,105,115,101,44,32,116,104, + 101,32,108,111,99,107,32,105,115,32,97,108,119,97,121,115, + 32,97,99,113,117,105,114,101,100,32,97,110,100,32,84,114, + 117,101,32,105,115,32,114,101,116,117,114,110,101,100,46,10, + 32,32,32,32,32,32,32,32,105,0,0,0,0,105,1,0, + 0,0,84,117,23,0,0,0,100,101,97,100,108,111,99,107, + 32,100,101,116,101,99,116,101,100,32,98,121,32,37,114,70, + 78,40,12,0,0,0,117,7,0,0,0,95,116,104,114,101, + 97,100,117,9,0,0,0,103,101,116,95,105,100,101,110,116, + 117,12,0,0,0,95,98,108,111,99,107,105,110,103,95,111, + 110,117,4,0,0,0,108,111,99,107,117,5,0,0,0,99, + 111,117,110,116,117,5,0,0,0,111,119,110,101,114,117,12, + 0,0,0,104,97,115,95,100,101,97,100,108,111,99,107,117, + 14,0,0,0,95,68,101,97,100,108,111,99,107,69,114,114, + 111,114,117,6,0,0,0,119,97,107,101,117,112,117,7,0, + 0,0,97,99,113,117,105,114,101,117,7,0,0,0,119,97, + 105,116,101,114,115,117,7,0,0,0,114,101,108,101,97,115, + 101,40,2,0,0,0,117,4,0,0,0,115,101,108,102,117, + 3,0,0,0,116,105,100,40,0,0,0,0,40,0,0,0, 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, - 97,112,62,117,8,0,0,0,95,95,114,101,112,114,95,95, - 239,0,0,0,115,2,0,0,0,0,1,117,20,0,0,0, - 95,77,111,100,117,108,101,76,111,99,107,46,95,95,114,101, - 112,114,95,95,78,40,9,0,0,0,117,8,0,0,0,95, - 95,110,97,109,101,95,95,117,10,0,0,0,95,95,109,111, - 100,117,108,101,95,95,117,12,0,0,0,95,95,113,117,97, - 108,110,97,109,101,95,95,117,7,0,0,0,95,95,100,111, - 99,95,95,117,8,0,0,0,95,95,105,110,105,116,95,95, - 117,12,0,0,0,104,97,115,95,100,101,97,100,108,111,99, - 107,117,7,0,0,0,97,99,113,117,105,114,101,117,7,0, - 0,0,114,101,108,101,97,115,101,117,8,0,0,0,95,95, - 114,101,112,114,95,95,40,1,0,0,0,117,10,0,0,0, - 95,95,108,111,99,97,108,115,95,95,40,0,0,0,0,40, - 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, - 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,62,117,11,0,0,0,95,77,111,100,117, - 108,101,76,111,99,107,175,0,0,0,115,12,0,0,0,16, - 4,6,2,12,8,12,12,12,25,12,13,117,11,0,0,0, - 95,77,111,100,117,108,101,76,111,99,107,99,1,0,0,0, - 0,0,0,0,1,0,0,0,2,0,0,0,66,0,0,0, - 115,74,0,0,0,124,0,0,69,101,0,0,90,1,0,100, - 0,0,90,2,0,100,1,0,90,3,0,100,2,0,100,3, - 0,132,0,0,90,4,0,100,4,0,100,5,0,132,0,0, - 90,5,0,100,6,0,100,7,0,132,0,0,90,6,0,100, - 8,0,100,9,0,132,0,0,90,7,0,100,10,0,83,40, - 11,0,0,0,117,16,0,0,0,95,68,117,109,109,121,77, - 111,100,117,108,101,76,111,99,107,117,86,0,0,0,65,32, - 115,105,109,112,108,101,32,95,77,111,100,117,108,101,76,111, - 99,107,32,101,113,117,105,118,97,108,101,110,116,32,102,111, - 114,32,80,121,116,104,111,110,32,98,117,105,108,100,115,32, - 119,105,116,104,111,117,116,10,32,32,32,32,109,117,108,116, - 105,45,116,104,114,101,97,100,105,110,103,32,115,117,112,112, - 111,114,116,46,99,2,0,0,0,0,0,0,0,2,0,0, - 0,2,0,0,0,67,0,0,0,115,22,0,0,0,124,1, - 0,124,0,0,95,0,0,100,1,0,124,0,0,95,1,0, - 100,0,0,83,40,2,0,0,0,78,105,0,0,0,0,40, - 2,0,0,0,117,4,0,0,0,110,97,109,101,117,5,0, - 0,0,99,111,117,110,116,40,2,0,0,0,117,4,0,0, - 0,115,101,108,102,117,4,0,0,0,110,97,109,101,40,0, - 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, - 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, - 98,111,111,116,115,116,114,97,112,62,117,8,0,0,0,95, - 95,105,110,105,116,95,95,247,0,0,0,115,4,0,0,0, - 0,1,9,1,117,25,0,0,0,95,68,117,109,109,121,77, - 111,100,117,108,101,76,111,99,107,46,95,95,105,110,105,116, - 95,95,99,1,0,0,0,0,0,0,0,1,0,0,0,3, - 0,0,0,67,0,0,0,115,19,0,0,0,124,0,0,4, - 106,0,0,100,1,0,55,2,95,0,0,100,2,0,83,40, - 3,0,0,0,78,105,1,0,0,0,84,40,1,0,0,0, - 117,5,0,0,0,99,111,117,110,116,40,1,0,0,0,117, - 4,0,0,0,115,101,108,102,40,0,0,0,0,40,0,0, - 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, - 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, - 114,97,112,62,117,7,0,0,0,97,99,113,117,105,114,101, - 251,0,0,0,115,4,0,0,0,0,1,15,1,117,24,0, - 0,0,95,68,117,109,109,121,77,111,100,117,108,101,76,111, - 99,107,46,97,99,113,117,105,114,101,99,1,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 49,0,0,0,124,0,0,106,0,0,100,1,0,107,2,0, - 114,30,0,116,1,0,100,2,0,131,1,0,130,1,0,110, - 0,0,124,0,0,4,106,0,0,100,3,0,56,2,95,0, - 0,100,0,0,83,40,4,0,0,0,78,105,0,0,0,0, - 117,31,0,0,0,99,97,110,110,111,116,32,114,101,108,101, - 97,115,101,32,117,110,45,97,99,113,117,105,114,101,100,32, - 108,111,99,107,105,1,0,0,0,40,2,0,0,0,117,5, - 0,0,0,99,111,117,110,116,117,12,0,0,0,82,117,110, - 116,105,109,101,69,114,114,111,114,40,1,0,0,0,117,4, - 0,0,0,115,101,108,102,40,0,0,0,0,40,0,0,0, - 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, - 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, - 97,112,62,117,7,0,0,0,114,101,108,101,97,115,101,255, - 0,0,0,115,6,0,0,0,0,1,15,1,15,1,117,24, - 0,0,0,95,68,117,109,109,121,77,111,100,117,108,101,76, + 97,112,62,117,7,0,0,0,97,99,113,117,105,114,101,203, + 0,0,0,115,32,0,0,0,0,6,12,1,10,1,3,1, + 3,1,10,1,30,1,9,1,15,1,4,1,12,1,19,1, + 18,1,24,2,13,1,20,2,117,19,0,0,0,95,77,111, + 100,117,108,101,76,111,99,107,46,97,99,113,117,105,114,101, + 99,1,0,0,0,0,0,0,0,2,0,0,0,10,0,0, + 0,67,0,0,0,115,165,0,0,0,116,0,0,106,1,0, + 131,0,0,125,1,0,124,0,0,106,2,0,143,138,0,1, + 124,0,0,106,3,0,124,1,0,107,3,0,114,52,0,116, + 4,0,100,1,0,131,1,0,130,1,0,110,0,0,124,0, + 0,106,5,0,100,2,0,107,4,0,115,73,0,116,6,0, + 130,1,0,124,0,0,4,106,5,0,100,3,0,56,2,95, + 5,0,124,0,0,106,5,0,100,2,0,107,2,0,114,155, + 0,100,0,0,124,0,0,95,3,0,124,0,0,106,7,0, + 114,155,0,124,0,0,4,106,7,0,100,3,0,56,2,95, + 7,0,124,0,0,106,8,0,106,9,0,131,0,0,1,113, + 155,0,110,0,0,87,100,0,0,81,88,100,0,0,83,40, + 4,0,0,0,78,117,31,0,0,0,99,97,110,110,111,116, + 32,114,101,108,101,97,115,101,32,117,110,45,97,99,113,117, + 105,114,101,100,32,108,111,99,107,105,0,0,0,0,105,1, + 0,0,0,40,10,0,0,0,117,7,0,0,0,95,116,104, + 114,101,97,100,117,9,0,0,0,103,101,116,95,105,100,101, + 110,116,117,4,0,0,0,108,111,99,107,117,5,0,0,0, + 111,119,110,101,114,117,12,0,0,0,82,117,110,116,105,109, + 101,69,114,114,111,114,117,5,0,0,0,99,111,117,110,116, + 117,14,0,0,0,65,115,115,101,114,116,105,111,110,69,114, + 114,111,114,117,7,0,0,0,119,97,105,116,101,114,115,117, + 6,0,0,0,119,97,107,101,117,112,117,7,0,0,0,114, + 101,108,101,97,115,101,40,2,0,0,0,117,4,0,0,0, + 115,101,108,102,117,3,0,0,0,116,105,100,40,0,0,0, + 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, + 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, + 111,116,115,116,114,97,112,62,117,7,0,0,0,114,101,108, + 101,97,115,101,228,0,0,0,115,22,0,0,0,0,1,12, + 1,10,1,15,1,15,1,21,1,15,1,15,1,9,1,9, + 1,15,1,117,19,0,0,0,95,77,111,100,117,108,101,76, 111,99,107,46,114,101,108,101,97,115,101,99,1,0,0,0, 0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,0, 115,25,0,0,0,100,1,0,106,0,0,124,0,0,106,1, 0,116,2,0,124,0,0,131,1,0,131,2,0,83,40,2, - 0,0,0,78,117,28,0,0,0,95,68,117,109,109,121,77, - 111,100,117,108,101,76,111,99,107,40,123,33,114,125,41,32, - 97,116,32,123,125,40,3,0,0,0,117,6,0,0,0,102, - 111,114,109,97,116,117,4,0,0,0,110,97,109,101,117,2, - 0,0,0,105,100,40,1,0,0,0,117,4,0,0,0,115, - 101,108,102,40,0,0,0,0,40,0,0,0,0,117,29,0, - 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, - 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 8,0,0,0,95,95,114,101,112,114,95,95,4,1,0,0, - 115,2,0,0,0,0,1,117,25,0,0,0,95,68,117,109, - 109,121,77,111,100,117,108,101,76,111,99,107,46,95,95,114, - 101,112,114,95,95,78,40,8,0,0,0,117,8,0,0,0, - 95,95,110,97,109,101,95,95,117,10,0,0,0,95,95,109, - 111,100,117,108,101,95,95,117,12,0,0,0,95,95,113,117, - 97,108,110,97,109,101,95,95,117,7,0,0,0,95,95,100, - 111,99,95,95,117,8,0,0,0,95,95,105,110,105,116,95, - 95,117,7,0,0,0,97,99,113,117,105,114,101,117,7,0, - 0,0,114,101,108,101,97,115,101,117,8,0,0,0,95,95, - 114,101,112,114,95,95,40,1,0,0,0,117,10,0,0,0, - 95,95,108,111,99,97,108,115,95,95,40,0,0,0,0,40, + 0,0,0,78,117,23,0,0,0,95,77,111,100,117,108,101, + 76,111,99,107,40,123,33,114,125,41,32,97,116,32,123,125, + 40,3,0,0,0,117,6,0,0,0,102,111,114,109,97,116, + 117,4,0,0,0,110,97,109,101,117,2,0,0,0,105,100, + 40,1,0,0,0,117,4,0,0,0,115,101,108,102,40,0, + 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, + 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, + 98,111,111,116,115,116,114,97,112,62,117,8,0,0,0,95, + 95,114,101,112,114,95,95,241,0,0,0,115,2,0,0,0, + 0,1,117,20,0,0,0,95,77,111,100,117,108,101,76,111, + 99,107,46,95,95,114,101,112,114,95,95,78,40,9,0,0, + 0,117,8,0,0,0,95,95,110,97,109,101,95,95,117,10, + 0,0,0,95,95,109,111,100,117,108,101,95,95,117,12,0, + 0,0,95,95,113,117,97,108,110,97,109,101,95,95,117,7, + 0,0,0,95,95,100,111,99,95,95,117,8,0,0,0,95, + 95,105,110,105,116,95,95,117,12,0,0,0,104,97,115,95, + 100,101,97,100,108,111,99,107,117,7,0,0,0,97,99,113, + 117,105,114,101,117,7,0,0,0,114,101,108,101,97,115,101, + 117,8,0,0,0,95,95,114,101,112,114,95,95,40,1,0, + 0,0,117,10,0,0,0,95,95,108,111,99,97,108,115,95, + 95,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, + 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, + 98,46,95,98,111,111,116,115,116,114,97,112,62,117,11,0, + 0,0,95,77,111,100,117,108,101,76,111,99,107,177,0,0, + 0,115,12,0,0,0,16,4,6,2,12,8,12,12,12,25, + 12,13,117,11,0,0,0,95,77,111,100,117,108,101,76,111, + 99,107,99,1,0,0,0,0,0,0,0,1,0,0,0,2, + 0,0,0,66,0,0,0,115,74,0,0,0,124,0,0,69, + 101,0,0,90,1,0,100,0,0,90,2,0,100,1,0,90, + 3,0,100,2,0,100,3,0,132,0,0,90,4,0,100,4, + 0,100,5,0,132,0,0,90,5,0,100,6,0,100,7,0, + 132,0,0,90,6,0,100,8,0,100,9,0,132,0,0,90, + 7,0,100,10,0,83,40,11,0,0,0,117,16,0,0,0, + 95,68,117,109,109,121,77,111,100,117,108,101,76,111,99,107, + 117,86,0,0,0,65,32,115,105,109,112,108,101,32,95,77, + 111,100,117,108,101,76,111,99,107,32,101,113,117,105,118,97, + 108,101,110,116,32,102,111,114,32,80,121,116,104,111,110,32, + 98,117,105,108,100,115,32,119,105,116,104,111,117,116,10,32, + 32,32,32,109,117,108,116,105,45,116,104,114,101,97,100,105, + 110,103,32,115,117,112,112,111,114,116,46,99,2,0,0,0, + 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, + 115,22,0,0,0,124,1,0,124,0,0,95,0,0,100,1, + 0,124,0,0,95,1,0,100,0,0,83,40,2,0,0,0, + 78,105,0,0,0,0,40,2,0,0,0,117,4,0,0,0, + 110,97,109,101,117,5,0,0,0,99,111,117,110,116,40,2, + 0,0,0,117,4,0,0,0,115,101,108,102,117,4,0,0, + 0,110,97,109,101,40,0,0,0,0,40,0,0,0,0,117, + 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, + 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, + 62,117,8,0,0,0,95,95,105,110,105,116,95,95,249,0, + 0,0,115,4,0,0,0,0,1,9,1,117,25,0,0,0, + 95,68,117,109,109,121,77,111,100,117,108,101,76,111,99,107, + 46,95,95,105,110,105,116,95,95,99,1,0,0,0,0,0, + 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,19, + 0,0,0,124,0,0,4,106,0,0,100,1,0,55,2,95, + 0,0,100,2,0,83,40,3,0,0,0,78,105,1,0,0, + 0,84,40,1,0,0,0,117,5,0,0,0,99,111,117,110, + 116,40,1,0,0,0,117,4,0,0,0,115,101,108,102,40, + 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, + 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, + 95,98,111,111,116,115,116,114,97,112,62,117,7,0,0,0, + 97,99,113,117,105,114,101,253,0,0,0,115,4,0,0,0, + 0,1,15,1,117,24,0,0,0,95,68,117,109,109,121,77, + 111,100,117,108,101,76,111,99,107,46,97,99,113,117,105,114, + 101,99,1,0,0,0,0,0,0,0,1,0,0,0,3,0, + 0,0,67,0,0,0,115,49,0,0,0,124,0,0,106,0, + 0,100,1,0,107,2,0,114,30,0,116,1,0,100,2,0, + 131,1,0,130,1,0,110,0,0,124,0,0,4,106,0,0, + 100,3,0,56,2,95,0,0,100,0,0,83,40,4,0,0, + 0,78,105,0,0,0,0,117,31,0,0,0,99,97,110,110, + 111,116,32,114,101,108,101,97,115,101,32,117,110,45,97,99, + 113,117,105,114,101,100,32,108,111,99,107,105,1,0,0,0, + 40,2,0,0,0,117,5,0,0,0,99,111,117,110,116,117, + 12,0,0,0,82,117,110,116,105,109,101,69,114,114,111,114, + 40,1,0,0,0,117,4,0,0,0,115,101,108,102,40,0, + 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, + 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, + 98,111,111,116,115,116,114,97,112,62,117,7,0,0,0,114, + 101,108,101,97,115,101,1,1,0,0,115,6,0,0,0,0, + 1,15,1,15,1,117,24,0,0,0,95,68,117,109,109,121, + 77,111,100,117,108,101,76,111,99,107,46,114,101,108,101,97, + 115,101,99,1,0,0,0,0,0,0,0,1,0,0,0,4, + 0,0,0,67,0,0,0,115,25,0,0,0,100,1,0,106, + 0,0,124,0,0,106,1,0,116,2,0,124,0,0,131,1, + 0,131,2,0,83,40,2,0,0,0,78,117,28,0,0,0, + 95,68,117,109,109,121,77,111,100,117,108,101,76,111,99,107, + 40,123,33,114,125,41,32,97,116,32,123,125,40,3,0,0, + 0,117,6,0,0,0,102,111,114,109,97,116,117,4,0,0, + 0,110,97,109,101,117,2,0,0,0,105,100,40,1,0,0, + 0,117,4,0,0,0,115,101,108,102,40,0,0,0,0,40, 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, - 115,116,114,97,112,62,117,16,0,0,0,95,68,117,109,109, - 121,77,111,100,117,108,101,76,111,99,107,243,0,0,0,115, - 10,0,0,0,16,2,6,2,12,4,12,4,12,5,117,16, + 115,116,114,97,112,62,117,8,0,0,0,95,95,114,101,112, + 114,95,95,6,1,0,0,115,2,0,0,0,0,1,117,25, 0,0,0,95,68,117,109,109,121,77,111,100,117,108,101,76, - 111,99,107,99,1,0,0,0,0,0,0,0,3,0,0,0, - 11,0,0,0,3,0,0,0,115,142,0,0,0,100,1,0, - 125,1,0,121,17,0,116,0,0,136,0,0,25,131,0,0, - 125,1,0,87,110,18,0,4,116,1,0,107,10,0,114,43, - 0,1,1,1,89,110,1,0,88,124,1,0,100,1,0,107, - 8,0,114,138,0,116,2,0,100,1,0,107,8,0,114,83, - 0,116,3,0,136,0,0,131,1,0,125,1,0,110,12,0, - 116,4,0,136,0,0,131,1,0,125,1,0,135,0,0,102, - 1,0,100,2,0,100,3,0,134,0,0,125,2,0,116,5, - 0,106,6,0,124,1,0,124,2,0,131,2,0,116,0,0, - 136,0,0,60,110,0,0,124,1,0,83,40,4,0,0,0, - 117,109,0,0,0,71,101,116,32,111,114,32,99,114,101,97, - 116,101,32,116,104,101,32,109,111,100,117,108,101,32,108,111, - 99,107,32,102,111,114,32,97,32,103,105,118,101,110,32,109, - 111,100,117,108,101,32,110,97,109,101,46,10,10,32,32,32, - 32,83,104,111,117,108,100,32,111,110,108,121,32,98,101,32, - 99,97,108,108,101,100,32,119,105,116,104,32,116,104,101,32, - 105,109,112,111,114,116,32,108,111,99,107,32,116,97,107,101, - 110,46,78,99,1,0,0,0,0,0,0,0,1,0,0,0, - 2,0,0,0,19,0,0,0,115,11,0,0,0,116,0,0, - 136,0,0,61,100,0,0,83,40,1,0,0,0,78,40,1, - 0,0,0,117,13,0,0,0,95,109,111,100,117,108,101,95, - 108,111,99,107,115,40,1,0,0,0,117,1,0,0,0,95, - 40,1,0,0,0,117,4,0,0,0,110,97,109,101,40,0, + 111,99,107,46,95,95,114,101,112,114,95,95,78,40,8,0, + 0,0,117,8,0,0,0,95,95,110,97,109,101,95,95,117, + 10,0,0,0,95,95,109,111,100,117,108,101,95,95,117,12, + 0,0,0,95,95,113,117,97,108,110,97,109,101,95,95,117, + 7,0,0,0,95,95,100,111,99,95,95,117,8,0,0,0, + 95,95,105,110,105,116,95,95,117,7,0,0,0,97,99,113, + 117,105,114,101,117,7,0,0,0,114,101,108,101,97,115,101, + 117,8,0,0,0,95,95,114,101,112,114,95,95,40,1,0, + 0,0,117,10,0,0,0,95,95,108,111,99,97,108,115,95, + 95,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, + 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, + 98,46,95,98,111,111,116,115,116,114,97,112,62,117,16,0, + 0,0,95,68,117,109,109,121,77,111,100,117,108,101,76,111, + 99,107,245,0,0,0,115,10,0,0,0,16,2,6,2,12, + 4,12,4,12,5,117,16,0,0,0,95,68,117,109,109,121, + 77,111,100,117,108,101,76,111,99,107,99,1,0,0,0,0, + 0,0,0,3,0,0,0,11,0,0,0,3,0,0,0,115, + 142,0,0,0,100,1,0,125,1,0,121,17,0,116,0,0, + 136,0,0,25,131,0,0,125,1,0,87,110,18,0,4,116, + 1,0,107,10,0,114,43,0,1,1,1,89,110,1,0,88, + 124,1,0,100,1,0,107,8,0,114,138,0,116,2,0,100, + 1,0,107,8,0,114,83,0,116,3,0,136,0,0,131,1, + 0,125,1,0,110,12,0,116,4,0,136,0,0,131,1,0, + 125,1,0,135,0,0,102,1,0,100,2,0,100,3,0,134, + 0,0,125,2,0,116,5,0,106,6,0,124,1,0,124,2, + 0,131,2,0,116,0,0,136,0,0,60,110,0,0,124,1, + 0,83,40,4,0,0,0,117,109,0,0,0,71,101,116,32, + 111,114,32,99,114,101,97,116,101,32,116,104,101,32,109,111, + 100,117,108,101,32,108,111,99,107,32,102,111,114,32,97,32, + 103,105,118,101,110,32,109,111,100,117,108,101,32,110,97,109, + 101,46,10,10,32,32,32,32,83,104,111,117,108,100,32,111, + 110,108,121,32,98,101,32,99,97,108,108,101,100,32,119,105, + 116,104,32,116,104,101,32,105,109,112,111,114,116,32,108,111, + 99,107,32,116,97,107,101,110,46,78,99,1,0,0,0,0, + 0,0,0,1,0,0,0,2,0,0,0,19,0,0,0,115, + 11,0,0,0,116,0,0,136,0,0,61,100,0,0,83,40, + 1,0,0,0,78,40,1,0,0,0,117,13,0,0,0,95, + 109,111,100,117,108,101,95,108,111,99,107,115,40,1,0,0, + 0,117,1,0,0,0,95,40,1,0,0,0,117,4,0,0, + 0,110,97,109,101,40,0,0,0,0,117,29,0,0,0,60, + 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, + 46,95,98,111,111,116,115,116,114,97,112,62,117,2,0,0, + 0,99,98,26,1,0,0,115,2,0,0,0,0,1,117,28, + 0,0,0,95,103,101,116,95,109,111,100,117,108,101,95,108, + 111,99,107,46,60,108,111,99,97,108,115,62,46,99,98,40, + 7,0,0,0,117,13,0,0,0,95,109,111,100,117,108,101, + 95,108,111,99,107,115,117,8,0,0,0,75,101,121,69,114, + 114,111,114,117,7,0,0,0,95,116,104,114,101,97,100,117, + 16,0,0,0,95,68,117,109,109,121,77,111,100,117,108,101, + 76,111,99,107,117,11,0,0,0,95,77,111,100,117,108,101, + 76,111,99,107,117,8,0,0,0,95,119,101,97,107,114,101, + 102,117,3,0,0,0,114,101,102,40,3,0,0,0,117,4, + 0,0,0,110,97,109,101,117,4,0,0,0,108,111,99,107, + 117,2,0,0,0,99,98,40,0,0,0,0,40,1,0,0, + 0,117,4,0,0,0,110,97,109,101,117,29,0,0,0,60, + 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, + 46,95,98,111,111,116,115,116,114,97,112,62,117,16,0,0, + 0,95,103,101,116,95,109,111,100,117,108,101,95,108,111,99, + 107,12,1,0,0,115,24,0,0,0,0,4,6,1,3,1, + 17,1,13,1,5,1,12,1,12,1,15,2,12,1,18,2, + 25,1,117,16,0,0,0,95,103,101,116,95,109,111,100,117, + 108,101,95,108,111,99,107,99,1,0,0,0,0,0,0,0, + 2,0,0,0,11,0,0,0,67,0,0,0,115,71,0,0, + 0,116,0,0,124,0,0,131,1,0,125,1,0,116,1,0, + 106,2,0,131,0,0,1,121,14,0,124,1,0,106,3,0, + 131,0,0,1,87,110,18,0,4,116,4,0,107,10,0,114, + 56,0,1,1,1,89,110,11,0,88,124,1,0,106,5,0, + 131,0,0,1,100,1,0,83,40,2,0,0,0,117,21,1, + 0,0,82,101,108,101,97,115,101,32,116,104,101,32,103,108, + 111,98,97,108,32,105,109,112,111,114,116,32,108,111,99,107, + 44,32,97,110,100,32,97,99,113,117,105,114,101,115,32,116, + 104,101,110,32,114,101,108,101,97,115,101,32,116,104,101,10, + 32,32,32,32,109,111,100,117,108,101,32,108,111,99,107,32, + 102,111,114,32,97,32,103,105,118,101,110,32,109,111,100,117, + 108,101,32,110,97,109,101,46,10,32,32,32,32,84,104,105, + 115,32,105,115,32,117,115,101,100,32,116,111,32,101,110,115, + 117,114,101,32,97,32,109,111,100,117,108,101,32,105,115,32, + 99,111,109,112,108,101,116,101,108,121,32,105,110,105,116,105, + 97,108,105,122,101,100,44,32,105,110,32,116,104,101,10,32, + 32,32,32,101,118,101,110,116,32,105,116,32,105,115,32,98, + 101,105,110,103,32,105,109,112,111,114,116,101,100,32,98,121, + 32,97,110,111,116,104,101,114,32,116,104,114,101,97,100,46, + 10,10,32,32,32,32,83,104,111,117,108,100,32,111,110,108, + 121,32,98,101,32,99,97,108,108,101,100,32,119,105,116,104, + 32,116,104,101,32,105,109,112,111,114,116,32,108,111,99,107, + 32,116,97,107,101,110,46,78,40,6,0,0,0,117,16,0, + 0,0,95,103,101,116,95,109,111,100,117,108,101,95,108,111, + 99,107,117,4,0,0,0,95,105,109,112,117,12,0,0,0, + 114,101,108,101,97,115,101,95,108,111,99,107,117,7,0,0, + 0,97,99,113,117,105,114,101,117,14,0,0,0,95,68,101, + 97,100,108,111,99,107,69,114,114,111,114,117,7,0,0,0, + 114,101,108,101,97,115,101,40,2,0,0,0,117,4,0,0, + 0,110,97,109,101,117,4,0,0,0,108,111,99,107,40,0, + 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, + 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, + 98,111,111,116,115,116,114,97,112,62,117,19,0,0,0,95, + 108,111,99,107,95,117,110,108,111,99,107,95,109,111,100,117, + 108,101,31,1,0,0,115,14,0,0,0,0,7,12,1,10, + 1,3,1,14,1,13,3,5,2,117,19,0,0,0,95,108, + 111,99,107,95,117,110,108,111,99,107,95,109,111,100,117,108, + 101,99,1,0,0,0,0,0,0,0,3,0,0,0,3,0, + 0,0,79,0,0,0,115,13,0,0,0,124,0,0,124,1, + 0,124,2,0,142,0,0,83,40,1,0,0,0,117,46,1, + 0,0,114,101,109,111,118,101,95,105,109,112,111,114,116,108, + 105,98,95,102,114,97,109,101,115,32,105,110,32,105,109,112, + 111,114,116,46,99,32,119,105,108,108,32,97,108,119,97,121, + 115,32,114,101,109,111,118,101,32,115,101,113,117,101,110,99, + 101,115,10,32,32,32,32,111,102,32,105,109,112,111,114,116, + 108,105,98,32,102,114,97,109,101,115,32,116,104,97,116,32, + 101,110,100,32,119,105,116,104,32,97,32,99,97,108,108,32, + 116,111,32,116,104,105,115,32,102,117,110,99,116,105,111,110, + 10,10,32,32,32,32,85,115,101,32,105,116,32,105,110,115, + 116,101,97,100,32,111,102,32,97,32,110,111,114,109,97,108, + 32,99,97,108,108,32,105,110,32,112,108,97,99,101,115,32, + 119,104,101,114,101,32,105,110,99,108,117,100,105,110,103,32, + 116,104,101,32,105,109,112,111,114,116,108,105,98,10,32,32, + 32,32,102,114,97,109,101,115,32,105,110,116,114,111,100,117, + 99,101,115,32,117,110,119,97,110,116,101,100,32,110,111,105, + 115,101,32,105,110,116,111,32,116,104,101,32,116,114,97,99, + 101,98,97,99,107,32,40,101,46,103,46,32,119,104,101,110, + 32,101,120,101,99,117,116,105,110,103,10,32,32,32,32,109, + 111,100,117,108,101,32,99,111,100,101,41,10,32,32,32,32, + 40,0,0,0,0,40,3,0,0,0,117,1,0,0,0,102, + 117,4,0,0,0,97,114,103,115,117,4,0,0,0,107,119, + 100,115,40,0,0,0,0,40,0,0,0,0,117,29,0,0, + 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, + 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,25, + 0,0,0,95,99,97,108,108,95,119,105,116,104,95,102,114, + 97,109,101,115,95,114,101,109,111,118,101,100,51,1,0,0, + 115,2,0,0,0,0,8,117,25,0,0,0,95,99,97,108, + 108,95,119,105,116,104,95,102,114,97,109,101,115,95,114,101, + 109,111,118,101,100,105,158,12,0,0,117,1,0,0,0,13, + 105,16,0,0,0,117,1,0,0,0,10,105,24,0,0,0, + 99,1,0,0,0,0,0,0,0,2,0,0,0,3,0,0, + 0,99,0,0,0,115,29,0,0,0,124,0,0,93,19,0, + 125,1,0,116,0,0,124,1,0,63,100,0,0,64,86,1, + 113,3,0,100,1,0,83,40,2,0,0,0,105,255,0,0, + 0,78,40,1,0,0,0,117,17,0,0,0,95,82,65,87, + 95,77,65,71,73,67,95,78,85,77,66,69,82,40,2,0, + 0,0,117,2,0,0,0,46,48,117,1,0,0,0,110,40, + 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, + 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, + 95,98,111,111,116,115,116,114,97,112,62,117,9,0,0,0, + 60,103,101,110,101,120,112,114,62,152,1,0,0,115,2,0, + 0,0,6,0,117,9,0,0,0,60,103,101,110,101,120,112, + 114,62,105,0,0,0,0,105,25,0,0,0,105,8,0,0, + 0,117,11,0,0,0,95,95,112,121,99,97,99,104,101,95, + 95,117,3,0,0,0,46,112,121,117,4,0,0,0,46,112, + 121,99,117,4,0,0,0,46,112,121,111,78,99,2,0,0, + 0,0,0,0,0,11,0,0,0,6,0,0,0,67,0,0, + 0,115,180,0,0,0,124,1,0,100,1,0,107,8,0,114, + 25,0,116,0,0,106,1,0,106,2,0,12,110,3,0,124, + 1,0,125,2,0,124,2,0,114,46,0,116,3,0,125,3, + 0,110,6,0,116,4,0,125,3,0,116,5,0,124,0,0, + 131,1,0,92,2,0,125,4,0,125,5,0,124,5,0,106, + 6,0,100,2,0,131,1,0,92,3,0,125,6,0,125,7, + 0,125,8,0,116,0,0,106,7,0,106,8,0,125,9,0, + 124,9,0,100,1,0,107,8,0,114,133,0,116,9,0,100, + 3,0,131,1,0,130,1,0,110,0,0,100,4,0,106,10, + 0,124,6,0,124,7,0,124,9,0,124,3,0,100,5,0, + 25,103,4,0,131,1,0,125,10,0,116,11,0,124,4,0, + 116,12,0,124,10,0,131,3,0,83,40,6,0,0,0,117, + 244,1,0,0,71,105,118,101,110,32,116,104,101,32,112,97, + 116,104,32,116,111,32,97,32,46,112,121,32,102,105,108,101, + 44,32,114,101,116,117,114,110,32,116,104,101,32,112,97,116, + 104,32,116,111,32,105,116,115,32,46,112,121,99,47,46,112, + 121,111,32,102,105,108,101,46,10,10,32,32,32,32,84,104, + 101,32,46,112,121,32,102,105,108,101,32,100,111,101,115,32, + 110,111,116,32,110,101,101,100,32,116,111,32,101,120,105,115, + 116,59,32,116,104,105,115,32,115,105,109,112,108,121,32,114, + 101,116,117,114,110,115,32,116,104,101,32,112,97,116,104,32, + 116,111,32,116,104,101,10,32,32,32,32,46,112,121,99,47, + 46,112,121,111,32,102,105,108,101,32,99,97,108,99,117,108, + 97,116,101,100,32,97,115,32,105,102,32,116,104,101,32,46, + 112,121,32,102,105,108,101,32,119,101,114,101,32,105,109,112, + 111,114,116,101,100,46,32,32,84,104,101,32,101,120,116,101, + 110,115,105,111,110,10,32,32,32,32,119,105,108,108,32,98, + 101,32,46,112,121,99,32,117,110,108,101,115,115,32,115,121, + 115,46,102,108,97,103,115,46,111,112,116,105,109,105,122,101, + 32,105,115,32,110,111,110,45,122,101,114,111,44,32,116,104, + 101,110,32,105,116,32,119,105,108,108,32,98,101,32,46,112, + 121,111,46,10,10,32,32,32,32,73,102,32,100,101,98,117, + 103,95,111,118,101,114,114,105,100,101,32,105,115,32,110,111, + 116,32,78,111,110,101,44,32,116,104,101,110,32,105,116,32, + 109,117,115,116,32,98,101,32,97,32,98,111,111,108,101,97, + 110,32,97,110,100,32,105,115,32,117,115,101,100,32,105,110, + 10,32,32,32,32,112,108,97,99,101,32,111,102,32,115,121, + 115,46,102,108,97,103,115,46,111,112,116,105,109,105,122,101, + 46,10,10,32,32,32,32,73,102,32,115,121,115,46,105,109, + 112,108,101,109,101,110,116,97,116,105,111,110,46,99,97,99, + 104,101,95,116,97,103,32,105,115,32,78,111,110,101,32,116, + 104,101,110,32,78,111,116,73,109,112,108,101,109,101,110,116, + 101,100,69,114,114,111,114,32,105,115,32,114,97,105,115,101, + 100,46,10,10,32,32,32,32,78,117,1,0,0,0,46,117, + 36,0,0,0,115,121,115,46,105,109,112,108,101,109,101,110, + 116,97,116,105,111,110,46,99,97,99,104,101,95,116,97,103, + 32,105,115,32,78,111,110,101,117,0,0,0,0,105,0,0, + 0,0,40,13,0,0,0,117,3,0,0,0,115,121,115,117, + 5,0,0,0,102,108,97,103,115,117,8,0,0,0,111,112, + 116,105,109,105,122,101,117,23,0,0,0,68,69,66,85,71, + 95,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88, + 69,83,117,27,0,0,0,79,80,84,73,77,73,90,69,68, + 95,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88, + 69,83,117,11,0,0,0,95,112,97,116,104,95,115,112,108, + 105,116,117,9,0,0,0,112,97,114,116,105,116,105,111,110, + 117,14,0,0,0,105,109,112,108,101,109,101,110,116,97,116, + 105,111,110,117,9,0,0,0,99,97,99,104,101,95,116,97, + 103,117,19,0,0,0,78,111,116,73,109,112,108,101,109,101, + 110,116,101,100,69,114,114,111,114,117,4,0,0,0,106,111, + 105,110,117,10,0,0,0,95,112,97,116,104,95,106,111,105, + 110,117,8,0,0,0,95,80,89,67,65,67,72,69,40,11, + 0,0,0,117,4,0,0,0,112,97,116,104,117,14,0,0, + 0,100,101,98,117,103,95,111,118,101,114,114,105,100,101,117, + 5,0,0,0,100,101,98,117,103,117,8,0,0,0,115,117, + 102,102,105,120,101,115,117,4,0,0,0,104,101,97,100,117, + 4,0,0,0,116,97,105,108,117,13,0,0,0,98,97,115, + 101,95,102,105,108,101,110,97,109,101,117,3,0,0,0,115, + 101,112,117,1,0,0,0,95,117,3,0,0,0,116,97,103, + 117,8,0,0,0,102,105,108,101,110,97,109,101,40,0,0, + 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, + 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, + 111,111,116,115,116,114,97,112,62,117,17,0,0,0,99,97, + 99,104,101,95,102,114,111,109,95,115,111,117,114,99,101,161, + 1,0,0,115,22,0,0,0,0,13,31,1,6,1,9,2, + 6,1,18,1,24,1,12,1,12,1,15,1,31,1,117,17, + 0,0,0,99,97,99,104,101,95,102,114,111,109,95,115,111, + 117,114,99,101,99,1,0,0,0,0,0,0,0,5,0,0, + 0,5,0,0,0,67,0,0,0,115,193,0,0,0,116,0, + 0,106,1,0,106,2,0,100,1,0,107,8,0,114,33,0, + 116,3,0,100,2,0,131,1,0,130,1,0,110,0,0,116, + 4,0,124,0,0,131,1,0,92,2,0,125,1,0,125,2, + 0,116,4,0,124,1,0,131,1,0,92,2,0,125,1,0, + 125,3,0,124,3,0,116,5,0,107,3,0,114,108,0,116, + 6,0,100,3,0,106,7,0,116,5,0,124,0,0,131,2, + 0,131,1,0,130,1,0,110,0,0,124,2,0,106,8,0, + 100,4,0,131,1,0,100,5,0,107,3,0,114,153,0,116, + 6,0,100,6,0,106,7,0,124,2,0,131,1,0,131,1, + 0,130,1,0,110,0,0,124,2,0,106,9,0,100,4,0, + 131,1,0,100,7,0,25,125,4,0,116,10,0,124,1,0, + 124,4,0,116,11,0,100,7,0,25,23,131,2,0,83,40, + 8,0,0,0,117,121,1,0,0,71,105,118,101,110,32,116, + 104,101,32,112,97,116,104,32,116,111,32,97,32,46,112,121, + 99,46,47,46,112,121,111,32,102,105,108,101,44,32,114,101, + 116,117,114,110,32,116,104,101,32,112,97,116,104,32,116,111, + 32,105,116,115,32,46,112,121,32,102,105,108,101,46,10,10, + 32,32,32,32,84,104,101,32,46,112,121,99,47,46,112,121, + 111,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32, + 110,101,101,100,32,116,111,32,101,120,105,115,116,59,32,116, + 104,105,115,32,115,105,109,112,108,121,32,114,101,116,117,114, + 110,115,32,116,104,101,32,112,97,116,104,32,116,111,10,32, + 32,32,32,116,104,101,32,46,112,121,32,102,105,108,101,32, + 99,97,108,99,117,108,97,116,101,100,32,116,111,32,99,111, + 114,114,101,115,112,111,110,100,32,116,111,32,116,104,101,32, + 46,112,121,99,47,46,112,121,111,32,102,105,108,101,46,32, + 32,73,102,32,112,97,116,104,32,100,111,101,115,10,32,32, + 32,32,110,111,116,32,99,111,110,102,111,114,109,32,116,111, + 32,80,69,80,32,51,49,52,55,32,102,111,114,109,97,116, + 44,32,86,97,108,117,101,69,114,114,111,114,32,119,105,108, + 108,32,98,101,32,114,97,105,115,101,100,46,32,73,102,10, + 32,32,32,32,115,121,115,46,105,109,112,108,101,109,101,110, + 116,97,116,105,111,110,46,99,97,99,104,101,95,116,97,103, + 32,105,115,32,78,111,110,101,32,116,104,101,110,32,78,111, + 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111, + 114,32,105,115,32,114,97,105,115,101,100,46,10,10,32,32, + 32,32,78,117,36,0,0,0,115,121,115,46,105,109,112,108, + 101,109,101,110,116,97,116,105,111,110,46,99,97,99,104,101, + 95,116,97,103,32,105,115,32,78,111,110,101,117,37,0,0, + 0,123,125,32,110,111,116,32,98,111,116,116,111,109,45,108, + 101,118,101,108,32,100,105,114,101,99,116,111,114,121,32,105, + 110,32,123,33,114,125,117,1,0,0,0,46,105,2,0,0, + 0,117,28,0,0,0,101,120,112,101,99,116,101,100,32,111, + 110,108,121,32,50,32,100,111,116,115,32,105,110,32,123,33, + 114,125,105,0,0,0,0,40,12,0,0,0,117,3,0,0, + 0,115,121,115,117,14,0,0,0,105,109,112,108,101,109,101, + 110,116,97,116,105,111,110,117,9,0,0,0,99,97,99,104, + 101,95,116,97,103,117,19,0,0,0,78,111,116,73,109,112, + 108,101,109,101,110,116,101,100,69,114,114,111,114,117,11,0, + 0,0,95,112,97,116,104,95,115,112,108,105,116,117,8,0, + 0,0,95,80,89,67,65,67,72,69,117,10,0,0,0,86, + 97,108,117,101,69,114,114,111,114,117,6,0,0,0,102,111, + 114,109,97,116,117,5,0,0,0,99,111,117,110,116,117,9, + 0,0,0,112,97,114,116,105,116,105,111,110,117,10,0,0, + 0,95,112,97,116,104,95,106,111,105,110,117,15,0,0,0, + 83,79,85,82,67,69,95,83,85,70,70,73,88,69,83,40, + 5,0,0,0,117,4,0,0,0,112,97,116,104,117,4,0, + 0,0,104,101,97,100,117,16,0,0,0,112,121,99,97,99, + 104,101,95,102,105,108,101,110,97,109,101,117,7,0,0,0, + 112,121,99,97,99,104,101,117,13,0,0,0,98,97,115,101, + 95,102,105,108,101,110,97,109,101,40,0,0,0,0,40,0, 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, - 116,114,97,112,62,117,2,0,0,0,99,98,24,1,0,0, - 115,2,0,0,0,0,1,117,28,0,0,0,95,103,101,116, - 95,109,111,100,117,108,101,95,108,111,99,107,46,60,108,111, - 99,97,108,115,62,46,99,98,40,7,0,0,0,117,13,0, - 0,0,95,109,111,100,117,108,101,95,108,111,99,107,115,117, - 8,0,0,0,75,101,121,69,114,114,111,114,117,7,0,0, - 0,95,116,104,114,101,97,100,117,16,0,0,0,95,68,117, - 109,109,121,77,111,100,117,108,101,76,111,99,107,117,11,0, - 0,0,95,77,111,100,117,108,101,76,111,99,107,117,8,0, - 0,0,95,119,101,97,107,114,101,102,117,3,0,0,0,114, - 101,102,40,3,0,0,0,117,4,0,0,0,110,97,109,101, - 117,4,0,0,0,108,111,99,107,117,2,0,0,0,99,98, - 40,0,0,0,0,40,1,0,0,0,117,4,0,0,0,110, - 97,109,101,117,29,0,0,0,60,102,114,111,122,101,110,32, - 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, - 116,114,97,112,62,117,16,0,0,0,95,103,101,116,95,109, - 111,100,117,108,101,95,108,111,99,107,10,1,0,0,115,24, - 0,0,0,0,4,6,1,3,1,17,1,13,1,5,1,12, - 1,12,1,15,2,12,1,18,2,25,1,117,16,0,0,0, - 95,103,101,116,95,109,111,100,117,108,101,95,108,111,99,107, - 99,1,0,0,0,0,0,0,0,2,0,0,0,11,0,0, - 0,67,0,0,0,115,71,0,0,0,116,0,0,124,0,0, - 131,1,0,125,1,0,116,1,0,106,2,0,131,0,0,1, - 121,14,0,124,1,0,106,3,0,131,0,0,1,87,110,18, - 0,4,116,4,0,107,10,0,114,56,0,1,1,1,89,110, - 11,0,88,124,1,0,106,5,0,131,0,0,1,100,1,0, - 83,40,2,0,0,0,117,21,1,0,0,82,101,108,101,97, - 115,101,32,116,104,101,32,103,108,111,98,97,108,32,105,109, - 112,111,114,116,32,108,111,99,107,44,32,97,110,100,32,97, - 99,113,117,105,114,101,115,32,116,104,101,110,32,114,101,108, - 101,97,115,101,32,116,104,101,10,32,32,32,32,109,111,100, - 117,108,101,32,108,111,99,107,32,102,111,114,32,97,32,103, - 105,118,101,110,32,109,111,100,117,108,101,32,110,97,109,101, - 46,10,32,32,32,32,84,104,105,115,32,105,115,32,117,115, - 101,100,32,116,111,32,101,110,115,117,114,101,32,97,32,109, - 111,100,117,108,101,32,105,115,32,99,111,109,112,108,101,116, - 101,108,121,32,105,110,105,116,105,97,108,105,122,101,100,44, - 32,105,110,32,116,104,101,10,32,32,32,32,101,118,101,110, - 116,32,105,116,32,105,115,32,98,101,105,110,103,32,105,109, - 112,111,114,116,101,100,32,98,121,32,97,110,111,116,104,101, - 114,32,116,104,114,101,97,100,46,10,10,32,32,32,32,83, - 104,111,117,108,100,32,111,110,108,121,32,98,101,32,99,97, - 108,108,101,100,32,119,105,116,104,32,116,104,101,32,105,109, - 112,111,114,116,32,108,111,99,107,32,116,97,107,101,110,46, - 78,40,6,0,0,0,117,16,0,0,0,95,103,101,116,95, - 109,111,100,117,108,101,95,108,111,99,107,117,4,0,0,0, - 95,105,109,112,117,12,0,0,0,114,101,108,101,97,115,101, - 95,108,111,99,107,117,7,0,0,0,97,99,113,117,105,114, - 101,117,14,0,0,0,95,68,101,97,100,108,111,99,107,69, - 114,114,111,114,117,7,0,0,0,114,101,108,101,97,115,101, - 40,2,0,0,0,117,4,0,0,0,110,97,109,101,117,4, - 0,0,0,108,111,99,107,40,0,0,0,0,40,0,0,0, - 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, - 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, - 97,112,62,117,19,0,0,0,95,108,111,99,107,95,117,110, - 108,111,99,107,95,109,111,100,117,108,101,29,1,0,0,115, - 14,0,0,0,0,7,12,1,10,1,3,1,14,1,13,3, - 5,2,117,19,0,0,0,95,108,111,99,107,95,117,110,108, - 111,99,107,95,109,111,100,117,108,101,99,1,0,0,0,0, - 0,0,0,3,0,0,0,3,0,0,0,79,0,0,0,115, - 13,0,0,0,124,0,0,124,1,0,124,2,0,142,0,0, - 83,40,1,0,0,0,117,46,1,0,0,114,101,109,111,118, - 101,95,105,109,112,111,114,116,108,105,98,95,102,114,97,109, - 101,115,32,105,110,32,105,109,112,111,114,116,46,99,32,119, - 105,108,108,32,97,108,119,97,121,115,32,114,101,109,111,118, - 101,32,115,101,113,117,101,110,99,101,115,10,32,32,32,32, - 111,102,32,105,109,112,111,114,116,108,105,98,32,102,114,97, - 109,101,115,32,116,104,97,116,32,101,110,100,32,119,105,116, - 104,32,97,32,99,97,108,108,32,116,111,32,116,104,105,115, - 32,102,117,110,99,116,105,111,110,10,10,32,32,32,32,85, - 115,101,32,105,116,32,105,110,115,116,101,97,100,32,111,102, - 32,97,32,110,111,114,109,97,108,32,99,97,108,108,32,105, - 110,32,112,108,97,99,101,115,32,119,104,101,114,101,32,105, - 110,99,108,117,100,105,110,103,32,116,104,101,32,105,109,112, - 111,114,116,108,105,98,10,32,32,32,32,102,114,97,109,101, - 115,32,105,110,116,114,111,100,117,99,101,115,32,117,110,119, - 97,110,116,101,100,32,110,111,105,115,101,32,105,110,116,111, - 32,116,104,101,32,116,114,97,99,101,98,97,99,107,32,40, - 101,46,103,46,32,119,104,101,110,32,101,120,101,99,117,116, - 105,110,103,10,32,32,32,32,109,111,100,117,108,101,32,99, - 111,100,101,41,10,32,32,32,32,40,0,0,0,0,40,3, - 0,0,0,117,1,0,0,0,102,117,4,0,0,0,97,114, - 103,115,117,4,0,0,0,107,119,100,115,40,0,0,0,0, - 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, - 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, - 116,115,116,114,97,112,62,117,25,0,0,0,95,99,97,108, - 108,95,119,105,116,104,95,102,114,97,109,101,115,95,114,101, - 109,111,118,101,100,49,1,0,0,115,2,0,0,0,0,8, - 117,25,0,0,0,95,99,97,108,108,95,119,105,116,104,95, - 102,114,97,109,101,115,95,114,101,109,111,118,101,100,105,158, - 12,0,0,117,1,0,0,0,13,105,16,0,0,0,117,1, - 0,0,0,10,105,24,0,0,0,99,1,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,99,0,0,0,115,29, - 0,0,0,124,0,0,93,19,0,125,1,0,116,0,0,124, - 1,0,63,100,0,0,64,86,1,113,3,0,100,1,0,83, - 40,2,0,0,0,105,255,0,0,0,78,40,1,0,0,0, - 117,17,0,0,0,95,82,65,87,95,77,65,71,73,67,95, - 78,85,77,66,69,82,40,2,0,0,0,117,2,0,0,0, - 46,48,117,1,0,0,0,110,40,0,0,0,0,40,0,0, - 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, - 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, - 114,97,112,62,117,9,0,0,0,60,103,101,110,101,120,112, - 114,62,150,1,0,0,115,2,0,0,0,6,0,117,9,0, - 0,0,60,103,101,110,101,120,112,114,62,105,0,0,0,0, - 105,25,0,0,0,105,8,0,0,0,117,11,0,0,0,95, - 95,112,121,99,97,99,104,101,95,95,117,3,0,0,0,46, - 112,121,117,4,0,0,0,46,112,121,99,117,4,0,0,0, - 46,112,121,111,78,99,2,0,0,0,0,0,0,0,11,0, - 0,0,6,0,0,0,67,0,0,0,115,180,0,0,0,124, - 1,0,100,1,0,107,8,0,114,25,0,116,0,0,106,1, - 0,106,2,0,12,110,3,0,124,1,0,125,2,0,124,2, - 0,114,46,0,116,3,0,125,3,0,110,6,0,116,4,0, - 125,3,0,116,5,0,124,0,0,131,1,0,92,2,0,125, - 4,0,125,5,0,124,5,0,106,6,0,100,2,0,131,1, - 0,92,3,0,125,6,0,125,7,0,125,8,0,116,0,0, - 106,7,0,106,8,0,125,9,0,124,9,0,100,1,0,107, - 8,0,114,133,0,116,9,0,100,3,0,131,1,0,130,1, - 0,110,0,0,100,4,0,106,10,0,124,6,0,124,7,0, - 124,9,0,124,3,0,100,5,0,25,103,4,0,131,1,0, - 125,10,0,116,11,0,124,4,0,116,12,0,124,10,0,131, - 3,0,83,40,6,0,0,0,117,244,1,0,0,71,105,118, - 101,110,32,116,104,101,32,112,97,116,104,32,116,111,32,97, - 32,46,112,121,32,102,105,108,101,44,32,114,101,116,117,114, - 110,32,116,104,101,32,112,97,116,104,32,116,111,32,105,116, - 115,32,46,112,121,99,47,46,112,121,111,32,102,105,108,101, - 46,10,10,32,32,32,32,84,104,101,32,46,112,121,32,102, - 105,108,101,32,100,111,101,115,32,110,111,116,32,110,101,101, - 100,32,116,111,32,101,120,105,115,116,59,32,116,104,105,115, - 32,115,105,109,112,108,121,32,114,101,116,117,114,110,115,32, - 116,104,101,32,112,97,116,104,32,116,111,32,116,104,101,10, - 32,32,32,32,46,112,121,99,47,46,112,121,111,32,102,105, - 108,101,32,99,97,108,99,117,108,97,116,101,100,32,97,115, - 32,105,102,32,116,104,101,32,46,112,121,32,102,105,108,101, - 32,119,101,114,101,32,105,109,112,111,114,116,101,100,46,32, - 32,84,104,101,32,101,120,116,101,110,115,105,111,110,10,32, - 32,32,32,119,105,108,108,32,98,101,32,46,112,121,99,32, - 117,110,108,101,115,115,32,115,121,115,46,102,108,97,103,115, - 46,111,112,116,105,109,105,122,101,32,105,115,32,110,111,110, - 45,122,101,114,111,44,32,116,104,101,110,32,105,116,32,119, - 105,108,108,32,98,101,32,46,112,121,111,46,10,10,32,32, - 32,32,73,102,32,100,101,98,117,103,95,111,118,101,114,114, - 105,100,101,32,105,115,32,110,111,116,32,78,111,110,101,44, - 32,116,104,101,110,32,105,116,32,109,117,115,116,32,98,101, - 32,97,32,98,111,111,108,101,97,110,32,97,110,100,32,105, - 115,32,117,115,101,100,32,105,110,10,32,32,32,32,112,108, - 97,99,101,32,111,102,32,115,121,115,46,102,108,97,103,115, - 46,111,112,116,105,109,105,122,101,46,10,10,32,32,32,32, - 73,102,32,115,121,115,46,105,109,112,108,101,109,101,110,116, - 97,116,105,111,110,46,99,97,99,104,101,95,116,97,103,32, - 105,115,32,78,111,110,101,32,116,104,101,110,32,78,111,116, - 73,109,112,108,101,109,101,110,116,101,100,69,114,114,111,114, - 32,105,115,32,114,97,105,115,101,100,46,10,10,32,32,32, - 32,78,117,1,0,0,0,46,117,36,0,0,0,115,121,115, - 46,105,109,112,108,101,109,101,110,116,97,116,105,111,110,46, - 99,97,99,104,101,95,116,97,103,32,105,115,32,78,111,110, - 101,117,0,0,0,0,105,0,0,0,0,40,13,0,0,0, - 117,3,0,0,0,115,121,115,117,5,0,0,0,102,108,97, - 103,115,117,8,0,0,0,111,112,116,105,109,105,122,101,117, - 23,0,0,0,68,69,66,85,71,95,66,89,84,69,67,79, - 68,69,95,83,85,70,70,73,88,69,83,117,27,0,0,0, - 79,80,84,73,77,73,90,69,68,95,66,89,84,69,67,79, - 68,69,95,83,85,70,70,73,88,69,83,117,11,0,0,0, - 95,112,97,116,104,95,115,112,108,105,116,117,9,0,0,0, - 112,97,114,116,105,116,105,111,110,117,14,0,0,0,105,109, - 112,108,101,109,101,110,116,97,116,105,111,110,117,9,0,0, - 0,99,97,99,104,101,95,116,97,103,117,19,0,0,0,78, - 111,116,73,109,112,108,101,109,101,110,116,101,100,69,114,114, - 111,114,117,4,0,0,0,106,111,105,110,117,10,0,0,0, - 95,112,97,116,104,95,106,111,105,110,117,8,0,0,0,95, - 80,89,67,65,67,72,69,40,11,0,0,0,117,4,0,0, - 0,112,97,116,104,117,14,0,0,0,100,101,98,117,103,95, - 111,118,101,114,114,105,100,101,117,5,0,0,0,100,101,98, - 117,103,117,8,0,0,0,115,117,102,102,105,120,101,115,117, - 4,0,0,0,104,101,97,100,117,4,0,0,0,116,97,105, - 108,117,13,0,0,0,98,97,115,101,95,102,105,108,101,110, - 97,109,101,117,3,0,0,0,115,101,112,117,1,0,0,0, - 95,117,3,0,0,0,116,97,103,117,8,0,0,0,102,105, - 108,101,110,97,109,101,40,0,0,0,0,40,0,0,0,0, + 116,114,97,112,62,117,17,0,0,0,115,111,117,114,99,101, + 95,102,114,111,109,95,99,97,99,104,101,188,1,0,0,115, + 24,0,0,0,0,9,18,1,15,1,18,1,18,1,12,1, + 9,1,18,1,21,1,9,1,15,1,19,1,117,17,0,0, + 0,115,111,117,114,99,101,95,102,114,111,109,95,99,97,99, + 104,101,99,1,0,0,0,0,0,0,0,5,0,0,0,13, + 0,0,0,67,0,0,0,115,164,0,0,0,116,0,0,124, + 0,0,131,1,0,100,1,0,107,2,0,114,22,0,100,2, + 0,83,124,0,0,106,1,0,100,3,0,131,1,0,92,3, + 0,125,1,0,125,2,0,125,3,0,124,1,0,12,115,81, + 0,124,3,0,106,2,0,131,0,0,100,7,0,100,8,0, + 133,2,0,25,100,6,0,107,3,0,114,85,0,124,0,0, + 83,121,16,0,116,3,0,124,0,0,131,1,0,125,4,0, + 87,110,40,0,4,116,4,0,116,5,0,102,2,0,107,10, + 0,114,143,0,1,1,1,116,6,0,100,9,0,100,2,0, + 133,2,0,25,125,4,0,89,110,1,0,88,116,7,0,116, + 8,0,131,1,0,114,160,0,124,4,0,83,124,0,0,83, + 40,10,0,0,0,117,188,0,0,0,67,111,110,118,101,114, + 116,32,97,32,98,121,116,101,99,111,100,101,32,102,105,108, + 101,32,112,97,116,104,32,116,111,32,97,32,115,111,117,114, + 99,101,32,112,97,116,104,32,40,105,102,32,112,111,115,115, + 105,98,108,101,41,46,10,10,32,32,32,32,84,104,105,115, + 32,102,117,110,99,116,105,111,110,32,101,120,105,115,116,115, + 32,112,117,114,101,108,121,32,102,111,114,32,98,97,99,107, + 119,97,114,100,115,45,99,111,109,112,97,116,105,98,105,108, + 105,116,121,32,102,111,114,10,32,32,32,32,80,121,73,109, + 112,111,114,116,95,69,120,101,99,67,111,100,101,77,111,100, + 117,108,101,87,105,116,104,70,105,108,101,110,97,109,101,115, + 40,41,32,105,110,32,116,104,101,32,67,32,65,80,73,46, + 10,10,32,32,32,32,105,0,0,0,0,78,117,1,0,0, + 0,46,105,3,0,0,0,105,1,0,0,0,117,3,0,0, + 0,46,112,121,105,253,255,255,255,105,255,255,255,255,105,255, + 255,255,255,40,9,0,0,0,117,3,0,0,0,108,101,110, + 117,9,0,0,0,114,112,97,114,105,116,105,111,110,117,5, + 0,0,0,108,111,119,101,114,117,17,0,0,0,115,111,117, + 114,99,101,95,102,114,111,109,95,99,97,99,104,101,117,19, + 0,0,0,78,111,116,73,109,112,108,101,109,101,110,116,101, + 100,69,114,114,111,114,117,10,0,0,0,86,97,108,117,101, + 69,114,114,111,114,117,12,0,0,0,98,121,116,99,111,100, + 101,95,112,97,116,104,117,12,0,0,0,95,112,97,116,104, + 95,105,115,102,105,108,101,117,12,0,0,0,115,111,117,114, + 99,101,95,115,116,97,116,115,40,5,0,0,0,117,13,0, + 0,0,98,121,116,101,99,111,100,101,95,112,97,116,104,117, + 4,0,0,0,114,101,115,116,117,1,0,0,0,95,117,9, + 0,0,0,101,120,116,101,110,115,105,111,110,117,11,0,0, + 0,115,111,117,114,99,101,95,112,97,116,104,40,0,0,0, + 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, + 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, + 111,116,115,116,114,97,112,62,117,15,0,0,0,95,103,101, + 116,95,115,111,117,114,99,101,102,105,108,101,211,1,0,0, + 115,20,0,0,0,0,7,18,1,4,1,24,1,35,1,4, + 2,3,1,16,1,19,1,21,2,117,15,0,0,0,95,103, + 101,116,95,115,111,117,114,99,101,102,105,108,101,99,1,0, + 0,0,0,0,0,0,2,0,0,0,4,0,0,0,71,0, + 0,0,115,75,0,0,0,116,0,0,106,1,0,106,2,0, + 114,71,0,124,0,0,106,3,0,100,6,0,131,1,0,115, + 40,0,100,3,0,124,0,0,23,125,0,0,110,0,0,116, + 4,0,124,0,0,106,5,0,124,1,0,140,0,0,100,4, + 0,116,0,0,106,6,0,131,1,1,1,110,0,0,100,5, + 0,83,40,7,0,0,0,117,61,0,0,0,80,114,105,110, + 116,32,116,104,101,32,109,101,115,115,97,103,101,32,116,111, + 32,115,116,100,101,114,114,32,105,102,32,45,118,47,80,89, + 84,72,79,78,86,69,82,66,79,83,69,32,105,115,32,116, + 117,114,110,101,100,32,111,110,46,117,1,0,0,0,35,117, + 7,0,0,0,105,109,112,111,114,116,32,117,2,0,0,0, + 35,32,117,4,0,0,0,102,105,108,101,78,40,2,0,0, + 0,117,1,0,0,0,35,117,7,0,0,0,105,109,112,111, + 114,116,32,40,7,0,0,0,117,3,0,0,0,115,121,115, + 117,5,0,0,0,102,108,97,103,115,117,7,0,0,0,118, + 101,114,98,111,115,101,117,10,0,0,0,115,116,97,114,116, + 115,119,105,116,104,117,5,0,0,0,112,114,105,110,116,117, + 6,0,0,0,102,111,114,109,97,116,117,6,0,0,0,115, + 116,100,101,114,114,40,2,0,0,0,117,7,0,0,0,109, + 101,115,115,97,103,101,117,4,0,0,0,97,114,103,115,40, + 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, + 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, + 95,98,111,111,116,115,116,114,97,112,62,117,16,0,0,0, + 95,118,101,114,98,111,115,101,95,109,101,115,115,97,103,101, + 232,1,0,0,115,8,0,0,0,0,2,12,1,15,1,13, + 1,117,16,0,0,0,95,118,101,114,98,111,115,101,95,109, + 101,115,115,97,103,101,99,1,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,3,0,0,0,115,35,0,0,0, + 135,0,0,102,1,0,100,1,0,100,2,0,134,0,0,125, + 1,0,116,0,0,124,1,0,136,0,0,131,2,0,1,124, + 1,0,83,40,3,0,0,0,117,39,0,0,0,83,101,116, + 32,95,95,112,97,99,107,97,103,101,95,95,32,111,110,32, + 116,104,101,32,114,101,116,117,114,110,101,100,32,109,111,100, + 117,108,101,46,99,0,0,0,0,0,0,0,0,3,0,0, + 0,4,0,0,0,31,0,0,0,115,101,0,0,0,136,0, + 0,124,0,0,124,1,0,142,0,0,125,2,0,116,0,0, + 124,2,0,100,1,0,100,0,0,131,3,0,100,0,0,107, + 8,0,114,97,0,124,2,0,106,1,0,124,2,0,95,2, + 0,116,3,0,124,2,0,100,2,0,131,2,0,115,97,0, + 124,2,0,106,2,0,106,4,0,100,3,0,131,1,0,100, + 4,0,25,124,2,0,95,2,0,113,97,0,110,0,0,124, + 2,0,83,40,5,0,0,0,78,117,11,0,0,0,95,95, + 112,97,99,107,97,103,101,95,95,117,8,0,0,0,95,95, + 112,97,116,104,95,95,117,1,0,0,0,46,105,0,0,0, + 0,40,5,0,0,0,117,7,0,0,0,103,101,116,97,116, + 116,114,117,8,0,0,0,95,95,110,97,109,101,95,95,117, + 11,0,0,0,95,95,112,97,99,107,97,103,101,95,95,117, + 7,0,0,0,104,97,115,97,116,116,114,117,10,0,0,0, + 114,112,97,114,116,105,116,105,111,110,40,3,0,0,0,117, + 4,0,0,0,97,114,103,115,117,6,0,0,0,107,119,97, + 114,103,115,117,6,0,0,0,109,111,100,117,108,101,40,1, + 0,0,0,117,3,0,0,0,102,120,110,40,0,0,0,0, 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, - 112,62,117,17,0,0,0,99,97,99,104,101,95,102,114,111, - 109,95,115,111,117,114,99,101,159,1,0,0,115,22,0,0, - 0,0,13,31,1,6,1,9,2,6,1,18,1,24,1,12, - 1,12,1,15,1,31,1,117,17,0,0,0,99,97,99,104, - 101,95,102,114,111,109,95,115,111,117,114,99,101,99,1,0, - 0,0,0,0,0,0,5,0,0,0,5,0,0,0,67,0, - 0,0,115,193,0,0,0,116,0,0,106,1,0,106,2,0, - 100,1,0,107,8,0,114,33,0,116,3,0,100,2,0,131, - 1,0,130,1,0,110,0,0,116,4,0,124,0,0,131,1, - 0,92,2,0,125,1,0,125,2,0,116,4,0,124,1,0, - 131,1,0,92,2,0,125,1,0,125,3,0,124,3,0,116, - 5,0,107,3,0,114,108,0,116,6,0,100,3,0,106,7, - 0,116,5,0,124,0,0,131,2,0,131,1,0,130,1,0, - 110,0,0,124,2,0,106,8,0,100,4,0,131,1,0,100, - 5,0,107,3,0,114,153,0,116,6,0,100,6,0,106,7, - 0,124,2,0,131,1,0,131,1,0,130,1,0,110,0,0, - 124,2,0,106,9,0,100,4,0,131,1,0,100,7,0,25, - 125,4,0,116,10,0,124,1,0,124,4,0,116,11,0,100, - 7,0,25,23,131,2,0,83,40,8,0,0,0,117,121,1, - 0,0,71,105,118,101,110,32,116,104,101,32,112,97,116,104, - 32,116,111,32,97,32,46,112,121,99,46,47,46,112,121,111, - 32,102,105,108,101,44,32,114,101,116,117,114,110,32,116,104, - 101,32,112,97,116,104,32,116,111,32,105,116,115,32,46,112, - 121,32,102,105,108,101,46,10,10,32,32,32,32,84,104,101, - 32,46,112,121,99,47,46,112,121,111,32,102,105,108,101,32, - 100,111,101,115,32,110,111,116,32,110,101,101,100,32,116,111, - 32,101,120,105,115,116,59,32,116,104,105,115,32,115,105,109, - 112,108,121,32,114,101,116,117,114,110,115,32,116,104,101,32, - 112,97,116,104,32,116,111,10,32,32,32,32,116,104,101,32, - 46,112,121,32,102,105,108,101,32,99,97,108,99,117,108,97, - 116,101,100,32,116,111,32,99,111,114,114,101,115,112,111,110, - 100,32,116,111,32,116,104,101,32,46,112,121,99,47,46,112, - 121,111,32,102,105,108,101,46,32,32,73,102,32,112,97,116, - 104,32,100,111,101,115,10,32,32,32,32,110,111,116,32,99, - 111,110,102,111,114,109,32,116,111,32,80,69,80,32,51,49, - 52,55,32,102,111,114,109,97,116,44,32,86,97,108,117,101, - 69,114,114,111,114,32,119,105,108,108,32,98,101,32,114,97, - 105,115,101,100,46,32,73,102,10,32,32,32,32,115,121,115, - 46,105,109,112,108,101,109,101,110,116,97,116,105,111,110,46, - 99,97,99,104,101,95,116,97,103,32,105,115,32,78,111,110, - 101,32,116,104,101,110,32,78,111,116,73,109,112,108,101,109, - 101,110,116,101,100,69,114,114,111,114,32,105,115,32,114,97, - 105,115,101,100,46,10,10,32,32,32,32,78,117,36,0,0, - 0,115,121,115,46,105,109,112,108,101,109,101,110,116,97,116, - 105,111,110,46,99,97,99,104,101,95,116,97,103,32,105,115, - 32,78,111,110,101,117,37,0,0,0,123,125,32,110,111,116, - 32,98,111,116,116,111,109,45,108,101,118,101,108,32,100,105, - 114,101,99,116,111,114,121,32,105,110,32,123,33,114,125,117, - 1,0,0,0,46,105,2,0,0,0,117,28,0,0,0,101, - 120,112,101,99,116,101,100,32,111,110,108,121,32,50,32,100, - 111,116,115,32,105,110,32,123,33,114,125,105,0,0,0,0, - 40,12,0,0,0,117,3,0,0,0,115,121,115,117,14,0, - 0,0,105,109,112,108,101,109,101,110,116,97,116,105,111,110, - 117,9,0,0,0,99,97,99,104,101,95,116,97,103,117,19, - 0,0,0,78,111,116,73,109,112,108,101,109,101,110,116,101, - 100,69,114,114,111,114,117,11,0,0,0,95,112,97,116,104, - 95,115,112,108,105,116,117,8,0,0,0,95,80,89,67,65, - 67,72,69,117,10,0,0,0,86,97,108,117,101,69,114,114, - 111,114,117,6,0,0,0,102,111,114,109,97,116,117,5,0, - 0,0,99,111,117,110,116,117,9,0,0,0,112,97,114,116, - 105,116,105,111,110,117,10,0,0,0,95,112,97,116,104,95, - 106,111,105,110,117,15,0,0,0,83,79,85,82,67,69,95, - 83,85,70,70,73,88,69,83,40,5,0,0,0,117,4,0, - 0,0,112,97,116,104,117,4,0,0,0,104,101,97,100,117, - 16,0,0,0,112,121,99,97,99,104,101,95,102,105,108,101, - 110,97,109,101,117,7,0,0,0,112,121,99,97,99,104,101, - 117,13,0,0,0,98,97,115,101,95,102,105,108,101,110,97, - 109,101,40,0,0,0,0,40,0,0,0,0,117,29,0,0, - 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, - 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,17, - 0,0,0,115,111,117,114,99,101,95,102,114,111,109,95,99, - 97,99,104,101,186,1,0,0,115,24,0,0,0,0,9,18, - 1,15,1,18,1,18,1,12,1,9,1,18,1,21,1,9, - 1,15,1,19,1,117,17,0,0,0,115,111,117,114,99,101, - 95,102,114,111,109,95,99,97,99,104,101,99,1,0,0,0, - 0,0,0,0,5,0,0,0,13,0,0,0,67,0,0,0, - 115,164,0,0,0,116,0,0,124,0,0,131,1,0,100,1, - 0,107,2,0,114,22,0,100,2,0,83,124,0,0,106,1, - 0,100,3,0,131,1,0,92,3,0,125,1,0,125,2,0, - 125,3,0,124,1,0,12,115,81,0,124,3,0,106,2,0, - 131,0,0,100,7,0,100,8,0,133,2,0,25,100,6,0, - 107,3,0,114,85,0,124,0,0,83,121,16,0,116,3,0, - 124,0,0,131,1,0,125,4,0,87,110,40,0,4,116,4, - 0,116,5,0,102,2,0,107,10,0,114,143,0,1,1,1, - 116,6,0,100,9,0,100,2,0,133,2,0,25,125,4,0, - 89,110,1,0,88,116,7,0,116,8,0,131,1,0,114,160, - 0,124,4,0,83,124,0,0,83,40,10,0,0,0,117,188, - 0,0,0,67,111,110,118,101,114,116,32,97,32,98,121,116, - 101,99,111,100,101,32,102,105,108,101,32,112,97,116,104,32, - 116,111,32,97,32,115,111,117,114,99,101,32,112,97,116,104, - 32,40,105,102,32,112,111,115,115,105,98,108,101,41,46,10, - 10,32,32,32,32,84,104,105,115,32,102,117,110,99,116,105, - 111,110,32,101,120,105,115,116,115,32,112,117,114,101,108,121, - 32,102,111,114,32,98,97,99,107,119,97,114,100,115,45,99, - 111,109,112,97,116,105,98,105,108,105,116,121,32,102,111,114, - 10,32,32,32,32,80,121,73,109,112,111,114,116,95,69,120, - 101,99,67,111,100,101,77,111,100,117,108,101,87,105,116,104, - 70,105,108,101,110,97,109,101,115,40,41,32,105,110,32,116, - 104,101,32,67,32,65,80,73,46,10,10,32,32,32,32,105, - 0,0,0,0,78,117,1,0,0,0,46,105,3,0,0,0, - 105,1,0,0,0,117,3,0,0,0,46,112,121,105,253,255, - 255,255,105,255,255,255,255,105,255,255,255,255,40,9,0,0, - 0,117,3,0,0,0,108,101,110,117,9,0,0,0,114,112, - 97,114,105,116,105,111,110,117,5,0,0,0,108,111,119,101, - 114,117,17,0,0,0,115,111,117,114,99,101,95,102,114,111, - 109,95,99,97,99,104,101,117,19,0,0,0,78,111,116,73, - 109,112,108,101,109,101,110,116,101,100,69,114,114,111,114,117, - 10,0,0,0,86,97,108,117,101,69,114,114,111,114,117,12, - 0,0,0,98,121,116,99,111,100,101,95,112,97,116,104,117, - 12,0,0,0,95,112,97,116,104,95,105,115,102,105,108,101, - 117,12,0,0,0,115,111,117,114,99,101,95,115,116,97,116, - 115,40,5,0,0,0,117,13,0,0,0,98,121,116,101,99, - 111,100,101,95,112,97,116,104,117,4,0,0,0,114,101,115, - 116,117,1,0,0,0,95,117,9,0,0,0,101,120,116,101, - 110,115,105,111,110,117,11,0,0,0,115,111,117,114,99,101, - 95,112,97,116,104,40,0,0,0,0,40,0,0,0,0,117, - 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, - 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, - 62,117,15,0,0,0,95,103,101,116,95,115,111,117,114,99, - 101,102,105,108,101,209,1,0,0,115,20,0,0,0,0,7, - 18,1,4,1,24,1,35,1,4,2,3,1,16,1,19,1, - 21,2,117,15,0,0,0,95,103,101,116,95,115,111,117,114, - 99,101,102,105,108,101,99,1,0,0,0,0,0,0,0,2, - 0,0,0,4,0,0,0,71,0,0,0,115,75,0,0,0, - 116,0,0,106,1,0,106,2,0,114,71,0,124,0,0,106, - 3,0,100,6,0,131,1,0,115,40,0,100,3,0,124,0, - 0,23,125,0,0,110,0,0,116,4,0,124,0,0,106,5, - 0,124,1,0,140,0,0,100,4,0,116,0,0,106,6,0, - 131,1,1,1,110,0,0,100,5,0,83,40,7,0,0,0, - 117,61,0,0,0,80,114,105,110,116,32,116,104,101,32,109, - 101,115,115,97,103,101,32,116,111,32,115,116,100,101,114,114, - 32,105,102,32,45,118,47,80,89,84,72,79,78,86,69,82, - 66,79,83,69,32,105,115,32,116,117,114,110,101,100,32,111, - 110,46,117,1,0,0,0,35,117,7,0,0,0,105,109,112, - 111,114,116,32,117,2,0,0,0,35,32,117,4,0,0,0, - 102,105,108,101,78,40,2,0,0,0,117,1,0,0,0,35, - 117,7,0,0,0,105,109,112,111,114,116,32,40,7,0,0, - 0,117,3,0,0,0,115,121,115,117,5,0,0,0,102,108, - 97,103,115,117,7,0,0,0,118,101,114,98,111,115,101,117, - 10,0,0,0,115,116,97,114,116,115,119,105,116,104,117,5, - 0,0,0,112,114,105,110,116,117,6,0,0,0,102,111,114, - 109,97,116,117,6,0,0,0,115,116,100,101,114,114,40,2, - 0,0,0,117,7,0,0,0,109,101,115,115,97,103,101,117, - 4,0,0,0,97,114,103,115,40,0,0,0,0,40,0,0, - 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, - 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, - 114,97,112,62,117,16,0,0,0,95,118,101,114,98,111,115, - 101,95,109,101,115,115,97,103,101,230,1,0,0,115,8,0, - 0,0,0,2,12,1,15,1,13,1,117,16,0,0,0,95, - 118,101,114,98,111,115,101,95,109,101,115,115,97,103,101,99, - 1,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, - 3,0,0,0,115,35,0,0,0,135,0,0,102,1,0,100, - 1,0,100,2,0,134,0,0,125,1,0,116,0,0,124,1, - 0,136,0,0,131,2,0,1,124,1,0,83,40,3,0,0, - 0,117,39,0,0,0,83,101,116,32,95,95,112,97,99,107, - 97,103,101,95,95,32,111,110,32,116,104,101,32,114,101,116, - 117,114,110,101,100,32,109,111,100,117,108,101,46,99,0,0, - 0,0,0,0,0,0,3,0,0,0,4,0,0,0,31,0, - 0,0,115,101,0,0,0,136,0,0,124,0,0,124,1,0, - 142,0,0,125,2,0,116,0,0,124,2,0,100,1,0,100, - 0,0,131,3,0,100,0,0,107,8,0,114,97,0,124,2, - 0,106,1,0,124,2,0,95,2,0,116,3,0,124,2,0, - 100,2,0,131,2,0,115,97,0,124,2,0,106,2,0,106, - 4,0,100,3,0,131,1,0,100,4,0,25,124,2,0,95, - 2,0,113,97,0,110,0,0,124,2,0,83,40,5,0,0, - 0,78,117,11,0,0,0,95,95,112,97,99,107,97,103,101, - 95,95,117,8,0,0,0,95,95,112,97,116,104,95,95,117, - 1,0,0,0,46,105,0,0,0,0,40,5,0,0,0,117, - 7,0,0,0,103,101,116,97,116,116,114,117,8,0,0,0, - 95,95,110,97,109,101,95,95,117,11,0,0,0,95,95,112, - 97,99,107,97,103,101,95,95,117,7,0,0,0,104,97,115, - 97,116,116,114,117,10,0,0,0,114,112,97,114,116,105,116, - 105,111,110,40,3,0,0,0,117,4,0,0,0,97,114,103, - 115,117,6,0,0,0,107,119,97,114,103,115,117,6,0,0, - 0,109,111,100,117,108,101,40,1,0,0,0,117,3,0,0, - 0,102,120,110,40,0,0,0,0,117,29,0,0,0,60,102, - 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, - 95,98,111,111,116,115,116,114,97,112,62,117,19,0,0,0, - 115,101,116,95,112,97,99,107,97,103,101,95,119,114,97,112, - 112,101,114,240,1,0,0,115,12,0,0,0,0,1,15,1, - 24,1,12,1,15,1,31,1,117,40,0,0,0,115,101,116, - 95,112,97,99,107,97,103,101,46,60,108,111,99,97,108,115, - 62,46,115,101,116,95,112,97,99,107,97,103,101,95,119,114, - 97,112,112,101,114,40,1,0,0,0,117,5,0,0,0,95, - 119,114,97,112,40,2,0,0,0,117,3,0,0,0,102,120, - 110,117,19,0,0,0,115,101,116,95,112,97,99,107,97,103, - 101,95,119,114,97,112,112,101,114,40,0,0,0,0,40,1, - 0,0,0,117,3,0,0,0,102,120,110,117,29,0,0,0, - 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, - 98,46,95,98,111,111,116,115,116,114,97,112,62,117,11,0, - 0,0,115,101,116,95,112,97,99,107,97,103,101,238,1,0, - 0,115,6,0,0,0,0,2,18,7,13,1,117,11,0,0, - 0,115,101,116,95,112,97,99,107,97,103,101,99,1,0,0, - 0,0,0,0,0,2,0,0,0,3,0,0,0,3,0,0, - 0,115,35,0,0,0,135,0,0,102,1,0,100,1,0,100, - 2,0,134,0,0,125,1,0,116,0,0,124,1,0,136,0, - 0,131,2,0,1,124,1,0,83,40,3,0,0,0,117,38, - 0,0,0,83,101,116,32,95,95,108,111,97,100,101,114,95, - 95,32,111,110,32,116,104,101,32,114,101,116,117,114,110,101, - 100,32,109,111,100,117,108,101,46,99,1,0,0,0,0,0, - 0,0,4,0,0,0,4,0,0,0,31,0,0,0,115,49, - 0,0,0,136,0,0,124,0,0,124,1,0,124,2,0,142, - 1,0,125,3,0,116,0,0,124,3,0,100,1,0,131,2, - 0,115,45,0,124,0,0,124,3,0,95,1,0,110,0,0, - 124,3,0,83,40,2,0,0,0,78,117,10,0,0,0,95, - 95,108,111,97,100,101,114,95,95,40,2,0,0,0,117,7, - 0,0,0,104,97,115,97,116,116,114,117,10,0,0,0,95, - 95,108,111,97,100,101,114,95,95,40,4,0,0,0,117,4, - 0,0,0,115,101,108,102,117,4,0,0,0,97,114,103,115, - 117,6,0,0,0,107,119,97,114,103,115,117,6,0,0,0, - 109,111,100,117,108,101,40,1,0,0,0,117,3,0,0,0, - 102,120,110,40,0,0,0,0,117,29,0,0,0,60,102,114, - 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, - 98,111,111,116,115,116,114,97,112,62,117,18,0,0,0,115, - 101,116,95,108,111,97,100,101,114,95,119,114,97,112,112,101, - 114,253,1,0,0,115,8,0,0,0,0,1,18,1,15,1, - 12,1,117,38,0,0,0,115,101,116,95,108,111,97,100,101, - 114,46,60,108,111,99,97,108,115,62,46,115,101,116,95,108, - 111,97,100,101,114,95,119,114,97,112,112,101,114,40,1,0, - 0,0,117,5,0,0,0,95,119,114,97,112,40,2,0,0, - 0,117,3,0,0,0,102,120,110,117,18,0,0,0,115,101, - 116,95,108,111,97,100,101,114,95,119,114,97,112,112,101,114, + 112,62,117,19,0,0,0,115,101,116,95,112,97,99,107,97, + 103,101,95,119,114,97,112,112,101,114,242,1,0,0,115,12, + 0,0,0,0,1,15,1,24,1,12,1,15,1,31,1,117, + 40,0,0,0,115,101,116,95,112,97,99,107,97,103,101,46, + 60,108,111,99,97,108,115,62,46,115,101,116,95,112,97,99, + 107,97,103,101,95,119,114,97,112,112,101,114,40,1,0,0, + 0,117,5,0,0,0,95,119,114,97,112,40,2,0,0,0, + 117,3,0,0,0,102,120,110,117,19,0,0,0,115,101,116, + 95,112,97,99,107,97,103,101,95,119,114,97,112,112,101,114, 40,0,0,0,0,40,1,0,0,0,117,3,0,0,0,102, 120,110,117,29,0,0,0,60,102,114,111,122,101,110,32,105, 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, - 114,97,112,62,117,10,0,0,0,115,101,116,95,108,111,97, - 100,101,114,251,1,0,0,115,6,0,0,0,0,2,18,5, - 13,1,117,10,0,0,0,115,101,116,95,108,111,97,100,101, - 114,99,1,0,0,0,0,0,0,0,2,0,0,0,3,0, - 0,0,3,0,0,0,115,35,0,0,0,135,0,0,102,1, - 0,100,1,0,100,2,0,134,0,0,125,1,0,116,0,0, - 124,1,0,136,0,0,131,2,0,1,124,1,0,83,40,3, - 0,0,0,117,42,3,0,0,68,101,99,111,114,97,116,111, - 114,32,116,111,32,104,97,110,100,108,101,32,115,101,108,101, - 99,116,105,110,103,32,116,104,101,32,112,114,111,112,101,114, - 32,109,111,100,117,108,101,32,102,111,114,32,108,111,97,100, - 101,114,115,46,10,10,32,32,32,32,84,104,101,32,100,101, - 99,111,114,97,116,101,100,32,102,117,110,99,116,105,111,110, - 32,105,115,32,112,97,115,115,101,100,32,116,104,101,32,109, - 111,100,117,108,101,32,116,111,32,117,115,101,32,105,110,115, - 116,101,97,100,32,111,102,32,116,104,101,32,109,111,100,117, - 108,101,10,32,32,32,32,110,97,109,101,46,32,84,104,101, - 32,109,111,100,117,108,101,32,112,97,115,115,101,100,32,105, - 110,32,116,111,32,116,104,101,32,102,117,110,99,116,105,111, - 110,32,105,115,32,101,105,116,104,101,114,32,102,114,111,109, - 32,115,121,115,46,109,111,100,117,108,101,115,32,105,102,10, - 32,32,32,32,105,116,32,97,108,114,101,97,100,121,32,101, - 120,105,115,116,115,32,111,114,32,105,115,32,97,32,110,101, - 119,32,109,111,100,117,108,101,46,32,73,102,32,116,104,101, - 32,109,111,100,117,108,101,32,105,115,32,110,101,119,44,32, - 116,104,101,110,32,95,95,110,97,109,101,95,95,10,32,32, - 32,32,105,115,32,115,101,116,32,116,104,101,32,102,105,114, - 115,116,32,97,114,103,117,109,101,110,116,32,116,111,32,116, - 104,101,32,109,101,116,104,111,100,44,32,95,95,108,111,97, - 100,101,114,95,95,32,105,115,32,115,101,116,32,116,111,32, - 115,101,108,102,44,32,97,110,100,10,32,32,32,32,95,95, - 112,97,99,107,97,103,101,95,95,32,105,115,32,115,101,116, - 32,97,99,99,111,114,100,105,110,103,108,121,32,40,105,102, - 32,115,101,108,102,46,105,115,95,112,97,99,107,97,103,101, - 40,41,32,105,115,32,100,101,102,105,110,101,100,41,32,119, - 105,108,108,32,98,101,32,115,101,116,10,32,32,32,32,98, - 101,102,111,114,101,32,105,116,32,105,115,32,112,97,115,115, - 101,100,32,116,111,32,116,104,101,32,100,101,99,111,114,97, - 116,101,100,32,102,117,110,99,116,105,111,110,32,40,105,102, - 32,115,101,108,102,46,105,115,95,112,97,99,107,97,103,101, - 40,41,32,100,111,101,115,10,32,32,32,32,110,111,116,32, - 119,111,114,107,32,102,111,114,32,116,104,101,32,109,111,100, - 117,108,101,32,105,116,32,119,105,108,108,32,98,101,32,115, - 101,116,32,112,111,115,116,45,108,111,97,100,41,46,10,10, - 32,32,32,32,73,102,32,97,110,32,101,120,99,101,112,116, - 105,111,110,32,105,115,32,114,97,105,115,101,100,32,97,110, - 100,32,116,104,101,32,100,101,99,111,114,97,116,111,114,32, - 99,114,101,97,116,101,100,32,116,104,101,32,109,111,100,117, - 108,101,32,105,116,32,105,115,10,32,32,32,32,115,117,98, - 115,101,113,117,101,110,116,108,121,32,114,101,109,111,118,101, - 100,32,102,114,111,109,32,115,121,115,46,109,111,100,117,108, - 101,115,46,10,10,32,32,32,32,84,104,101,32,100,101,99, - 111,114,97,116,111,114,32,97,115,115,117,109,101,115,32,116, - 104,97,116,32,116,104,101,32,100,101,99,111,114,97,116,101, - 100,32,102,117,110,99,116,105,111,110,32,116,97,107,101,115, - 32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101, - 32,97,115,10,32,32,32,32,116,104,101,32,115,101,99,111, - 110,100,32,97,114,103,117,109,101,110,116,46,10,10,32,32, - 32,32,99,2,0,0,0,0,0,0,0,7,0,0,0,25, - 0,0,0,31,0,0,0,115,254,0,0,0,116,0,0,106, - 1,0,106,2,0,124,1,0,131,1,0,125,4,0,124,4, - 0,100,0,0,107,9,0,125,5,0,124,5,0,115,168,0, - 116,3,0,124,1,0,131,1,0,125,4,0,100,1,0,124, - 4,0,95,4,0,124,4,0,116,0,0,106,1,0,124,1, - 0,60,124,0,0,124,4,0,95,5,0,121,19,0,124,0, - 0,106,6,0,124,1,0,131,1,0,125,6,0,87,110,24, - 0,4,116,7,0,116,8,0,102,2,0,107,10,0,114,124, - 0,1,1,1,89,113,177,0,88,124,6,0,114,143,0,124, - 1,0,124,4,0,95,9,0,113,177,0,124,1,0,106,10, - 0,100,2,0,131,1,0,100,3,0,25,124,4,0,95,9, - 0,110,9,0,100,1,0,124,4,0,95,4,0,122,60,0, - 121,23,0,136,0,0,124,0,0,124,4,0,124,2,0,124, - 3,0,142,2,0,83,87,110,30,0,1,1,1,124,5,0, - 115,228,0,116,0,0,106,1,0,124,1,0,61,110,0,0, - 130,0,0,89,110,1,0,88,87,100,0,0,100,4,0,124, - 4,0,95,4,0,88,100,0,0,83,40,5,0,0,0,78, - 84,117,1,0,0,0,46,105,0,0,0,0,70,40,11,0, - 0,0,117,3,0,0,0,115,121,115,117,7,0,0,0,109, - 111,100,117,108,101,115,117,3,0,0,0,103,101,116,117,10, - 0,0,0,110,101,119,95,109,111,100,117,108,101,117,16,0, - 0,0,95,95,105,110,105,116,105,97,108,105,122,105,110,103, - 95,95,117,10,0,0,0,95,95,108,111,97,100,101,114,95, - 95,117,10,0,0,0,105,115,95,112,97,99,107,97,103,101, - 117,11,0,0,0,73,109,112,111,114,116,69,114,114,111,114, - 117,14,0,0,0,65,116,116,114,105,98,117,116,101,69,114, - 114,111,114,117,11,0,0,0,95,95,112,97,99,107,97,103, - 101,95,95,117,10,0,0,0,114,112,97,114,116,105,116,105, - 111,110,40,7,0,0,0,117,4,0,0,0,115,101,108,102, - 117,8,0,0,0,102,117,108,108,110,97,109,101,117,4,0, - 0,0,97,114,103,115,117,6,0,0,0,107,119,97,114,103, - 115,117,6,0,0,0,109,111,100,117,108,101,117,9,0,0, - 0,105,115,95,114,101,108,111,97,100,117,10,0,0,0,105, - 115,95,112,97,99,107,97,103,101,40,1,0,0,0,117,3, - 0,0,0,102,120,110,40,0,0,0,0,117,29,0,0,0, - 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, - 98,46,95,98,111,111,116,115,116,114,97,112,62,117,25,0, - 0,0,109,111,100,117,108,101,95,102,111,114,95,108,111,97, - 100,101,114,95,119,114,97,112,112,101,114,24,2,0,0,115, - 44,0,0,0,0,1,18,1,12,1,6,4,12,3,9,1, - 13,1,9,1,3,1,19,1,19,1,5,2,6,1,12,2, - 25,2,9,1,6,2,23,1,3,1,6,1,13,1,12,2, - 117,52,0,0,0,109,111,100,117,108,101,95,102,111,114,95, - 108,111,97,100,101,114,46,60,108,111,99,97,108,115,62,46, - 109,111,100,117,108,101,95,102,111,114,95,108,111,97,100,101, - 114,95,119,114,97,112,112,101,114,40,1,0,0,0,117,5, - 0,0,0,95,119,114,97,112,40,2,0,0,0,117,3,0, - 0,0,102,120,110,117,25,0,0,0,109,111,100,117,108,101, - 95,102,111,114,95,108,111,97,100,101,114,95,119,114,97,112, - 112,101,114,40,0,0,0,0,40,1,0,0,0,117,3,0, - 0,0,102,120,110,117,29,0,0,0,60,102,114,111,122,101, - 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, - 116,115,116,114,97,112,62,117,17,0,0,0,109,111,100,117, - 108,101,95,102,111,114,95,108,111,97,100,101,114,6,2,0, - 0,115,6,0,0,0,0,18,18,33,13,1,117,17,0,0, - 0,109,111,100,117,108,101,95,102,111,114,95,108,111,97,100, - 101,114,99,1,0,0,0,0,0,0,0,2,0,0,0,4, - 0,0,0,3,0,0,0,115,38,0,0,0,100,1,0,135, - 0,0,102,1,0,100,2,0,100,3,0,134,1,0,125,1, - 0,116,0,0,124,1,0,136,0,0,131,2,0,1,124,1, - 0,83,40,4,0,0,0,117,252,0,0,0,68,101,99,111, - 114,97,116,111,114,32,116,111,32,118,101,114,105,102,121,32, - 116,104,97,116,32,116,104,101,32,109,111,100,117,108,101,32, - 98,101,105,110,103,32,114,101,113,117,101,115,116,101,100,32, - 109,97,116,99,104,101,115,32,116,104,101,32,111,110,101,32, - 116,104,101,10,32,32,32,32,108,111,97,100,101,114,32,99, - 97,110,32,104,97,110,100,108,101,46,10,10,32,32,32,32, - 84,104,101,32,102,105,114,115,116,32,97,114,103,117,109,101, - 110,116,32,40,115,101,108,102,41,32,109,117,115,116,32,100, - 101,102,105,110,101,32,95,110,97,109,101,32,119,104,105,99, - 104,32,116,104,101,32,115,101,99,111,110,100,32,97,114,103, - 117,109,101,110,116,32,105,115,10,32,32,32,32,99,111,109, - 112,97,114,101,100,32,97,103,97,105,110,115,116,46,32,73, - 102,32,116,104,101,32,99,111,109,112,97,114,105,115,111,110, - 32,102,97,105,108,115,32,116,104,101,110,32,73,109,112,111, - 114,116,69,114,114,111,114,32,105,115,32,114,97,105,115,101, - 100,46,10,10,32,32,32,32,78,99,2,0,0,0,0,0, - 0,0,4,0,0,0,5,0,0,0,31,0,0,0,115,83, - 0,0,0,124,1,0,100,0,0,107,8,0,114,24,0,124, - 0,0,106,0,0,125,1,0,110,40,0,124,0,0,106,0, - 0,124,1,0,107,3,0,114,64,0,116,1,0,100,1,0, - 124,1,0,22,100,2,0,124,1,0,131,1,1,130,1,0, - 110,0,0,136,0,0,124,0,0,124,1,0,124,2,0,124, - 3,0,142,2,0,83,40,3,0,0,0,78,117,23,0,0, - 0,108,111,97,100,101,114,32,99,97,110,110,111,116,32,104, - 97,110,100,108,101,32,37,115,117,4,0,0,0,110,97,109, - 101,40,2,0,0,0,117,4,0,0,0,110,97,109,101,117, - 11,0,0,0,73,109,112,111,114,116,69,114,114,111,114,40, - 4,0,0,0,117,4,0,0,0,115,101,108,102,117,4,0, - 0,0,110,97,109,101,117,4,0,0,0,97,114,103,115,117, - 6,0,0,0,107,119,97,114,103,115,40,1,0,0,0,117, - 6,0,0,0,109,101,116,104,111,100,40,0,0,0,0,117, - 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, - 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, - 62,117,19,0,0,0,95,99,104,101,99,107,95,110,97,109, - 101,95,119,114,97,112,112,101,114,69,2,0,0,115,10,0, - 0,0,0,1,12,1,12,1,15,1,25,1,117,40,0,0, - 0,95,99,104,101,99,107,95,110,97,109,101,46,60,108,111, - 99,97,108,115,62,46,95,99,104,101,99,107,95,110,97,109, - 101,95,119,114,97,112,112,101,114,40,1,0,0,0,117,5, - 0,0,0,95,119,114,97,112,40,2,0,0,0,117,6,0, - 0,0,109,101,116,104,111,100,117,19,0,0,0,95,99,104, - 101,99,107,95,110,97,109,101,95,119,114,97,112,112,101,114, - 40,0,0,0,0,40,1,0,0,0,117,6,0,0,0,109, - 101,116,104,111,100,117,29,0,0,0,60,102,114,111,122,101, - 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, - 116,115,116,114,97,112,62,117,11,0,0,0,95,99,104,101, - 99,107,95,110,97,109,101,61,2,0,0,115,6,0,0,0, - 0,8,21,6,13,1,117,11,0,0,0,95,99,104,101,99, - 107,95,110,97,109,101,99,1,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,3,0,0,0,115,35,0,0,0, - 135,0,0,102,1,0,100,1,0,100,2,0,134,0,0,125, - 1,0,116,0,0,124,1,0,136,0,0,131,2,0,1,124, - 1,0,83,40,3,0,0,0,117,49,0,0,0,68,101,99, - 111,114,97,116,111,114,32,116,111,32,118,101,114,105,102,121, - 32,116,104,101,32,110,97,109,101,100,32,109,111,100,117,108, - 101,32,105,115,32,98,117,105,108,116,45,105,110,46,99,2, - 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,19, - 0,0,0,115,58,0,0,0,124,1,0,116,0,0,106,1, - 0,107,7,0,114,45,0,116,2,0,100,1,0,106,3,0, - 124,1,0,131,1,0,100,2,0,124,1,0,131,1,1,130, - 1,0,110,0,0,136,0,0,124,0,0,124,1,0,131,2, - 0,83,40,3,0,0,0,78,117,27,0,0,0,123,125,32, - 105,115,32,110,111,116,32,97,32,98,117,105,108,116,45,105, - 110,32,109,111,100,117,108,101,117,4,0,0,0,110,97,109, - 101,40,4,0,0,0,117,3,0,0,0,115,121,115,117,20, - 0,0,0,98,117,105,108,116,105,110,95,109,111,100,117,108, - 101,95,110,97,109,101,115,117,11,0,0,0,73,109,112,111, - 114,116,69,114,114,111,114,117,6,0,0,0,102,111,114,109, - 97,116,40,2,0,0,0,117,4,0,0,0,115,101,108,102, - 117,8,0,0,0,102,117,108,108,110,97,109,101,40,1,0, + 114,97,112,62,117,11,0,0,0,115,101,116,95,112,97,99, + 107,97,103,101,240,1,0,0,115,6,0,0,0,0,2,18, + 7,13,1,117,11,0,0,0,115,101,116,95,112,97,99,107, + 97,103,101,99,1,0,0,0,0,0,0,0,2,0,0,0, + 3,0,0,0,3,0,0,0,115,35,0,0,0,135,0,0, + 102,1,0,100,1,0,100,2,0,134,0,0,125,1,0,116, + 0,0,124,1,0,136,0,0,131,2,0,1,124,1,0,83, + 40,3,0,0,0,117,38,0,0,0,83,101,116,32,95,95, + 108,111,97,100,101,114,95,95,32,111,110,32,116,104,101,32, + 114,101,116,117,114,110,101,100,32,109,111,100,117,108,101,46, + 99,1,0,0,0,0,0,0,0,4,0,0,0,4,0,0, + 0,31,0,0,0,115,49,0,0,0,136,0,0,124,0,0, + 124,1,0,124,2,0,142,1,0,125,3,0,116,0,0,124, + 3,0,100,1,0,131,2,0,115,45,0,124,0,0,124,3, + 0,95,1,0,110,0,0,124,3,0,83,40,2,0,0,0, + 78,117,10,0,0,0,95,95,108,111,97,100,101,114,95,95, + 40,2,0,0,0,117,7,0,0,0,104,97,115,97,116,116, + 114,117,10,0,0,0,95,95,108,111,97,100,101,114,95,95, + 40,4,0,0,0,117,4,0,0,0,115,101,108,102,117,4, + 0,0,0,97,114,103,115,117,6,0,0,0,107,119,97,114, + 103,115,117,6,0,0,0,109,111,100,117,108,101,40,1,0, 0,0,117,3,0,0,0,102,120,110,40,0,0,0,0,117, 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, - 62,117,25,0,0,0,95,114,101,113,117,105,114,101,115,95, - 98,117,105,108,116,105,110,95,119,114,97,112,112,101,114,81, - 2,0,0,115,8,0,0,0,0,1,15,1,18,1,12,1, - 117,52,0,0,0,95,114,101,113,117,105,114,101,115,95,98, - 117,105,108,116,105,110,46,60,108,111,99,97,108,115,62,46, - 95,114,101,113,117,105,114,101,115,95,98,117,105,108,116,105, - 110,95,119,114,97,112,112,101,114,40,1,0,0,0,117,5, - 0,0,0,95,119,114,97,112,40,2,0,0,0,117,3,0, - 0,0,102,120,110,117,25,0,0,0,95,114,101,113,117,105, - 114,101,115,95,98,117,105,108,116,105,110,95,119,114,97,112, - 112,101,114,40,0,0,0,0,40,1,0,0,0,117,3,0, - 0,0,102,120,110,117,29,0,0,0,60,102,114,111,122,101, - 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, - 116,115,116,114,97,112,62,117,17,0,0,0,95,114,101,113, - 117,105,114,101,115,95,98,117,105,108,116,105,110,79,2,0, - 0,115,6,0,0,0,0,2,18,5,13,1,117,17,0,0, - 0,95,114,101,113,117,105,114,101,115,95,98,117,105,108,116, - 105,110,99,1,0,0,0,0,0,0,0,2,0,0,0,3, - 0,0,0,3,0,0,0,115,35,0,0,0,135,0,0,102, - 1,0,100,1,0,100,2,0,134,0,0,125,1,0,116,0, - 0,124,1,0,136,0,0,131,2,0,1,124,1,0,83,40, - 3,0,0,0,117,47,0,0,0,68,101,99,111,114,97,116, - 111,114,32,116,111,32,118,101,114,105,102,121,32,116,104,101, - 32,110,97,109,101,100,32,109,111,100,117,108,101,32,105,115, - 32,102,114,111,122,101,110,46,99,2,0,0,0,0,0,0, - 0,2,0,0,0,4,0,0,0,19,0,0,0,115,58,0, - 0,0,116,0,0,106,1,0,124,1,0,131,1,0,115,45, - 0,116,2,0,100,1,0,106,3,0,124,1,0,131,1,0, - 100,2,0,124,1,0,131,1,1,130,1,0,110,0,0,136, - 0,0,124,0,0,124,1,0,131,2,0,83,40,3,0,0, - 0,78,117,25,0,0,0,123,125,32,105,115,32,110,111,116, - 32,97,32,102,114,111,122,101,110,32,109,111,100,117,108,101, - 117,4,0,0,0,110,97,109,101,40,4,0,0,0,117,4, - 0,0,0,95,105,109,112,117,9,0,0,0,105,115,95,102, - 114,111,122,101,110,117,11,0,0,0,73,109,112,111,114,116, - 69,114,114,111,114,117,6,0,0,0,102,111,114,109,97,116, - 40,2,0,0,0,117,4,0,0,0,115,101,108,102,117,8, - 0,0,0,102,117,108,108,110,97,109,101,40,1,0,0,0, - 117,3,0,0,0,102,120,110,40,0,0,0,0,117,29,0, - 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, - 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 24,0,0,0,95,114,101,113,117,105,114,101,115,95,102,114, - 111,122,101,110,95,119,114,97,112,112,101,114,92,2,0,0, - 115,8,0,0,0,0,1,15,1,18,1,12,1,117,50,0, - 0,0,95,114,101,113,117,105,114,101,115,95,102,114,111,122, - 101,110,46,60,108,111,99,97,108,115,62,46,95,114,101,113, - 117,105,114,101,115,95,102,114,111,122,101,110,95,119,114,97, + 62,117,18,0,0,0,115,101,116,95,108,111,97,100,101,114, + 95,119,114,97,112,112,101,114,255,1,0,0,115,8,0,0, + 0,0,1,18,1,15,1,12,1,117,38,0,0,0,115,101, + 116,95,108,111,97,100,101,114,46,60,108,111,99,97,108,115, + 62,46,115,101,116,95,108,111,97,100,101,114,95,119,114,97, 112,112,101,114,40,1,0,0,0,117,5,0,0,0,95,119, 114,97,112,40,2,0,0,0,117,3,0,0,0,102,120,110, - 117,24,0,0,0,95,114,101,113,117,105,114,101,115,95,102, - 114,111,122,101,110,95,119,114,97,112,112,101,114,40,0,0, - 0,0,40,1,0,0,0,117,3,0,0,0,102,120,110,117, + 117,18,0,0,0,115,101,116,95,108,111,97,100,101,114,95, + 119,114,97,112,112,101,114,40,0,0,0,0,40,1,0,0, + 0,117,3,0,0,0,102,120,110,117,29,0,0,0,60,102, + 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, + 95,98,111,111,116,115,116,114,97,112,62,117,10,0,0,0, + 115,101,116,95,108,111,97,100,101,114,253,1,0,0,115,6, + 0,0,0,0,2,18,5,13,1,117,10,0,0,0,115,101, + 116,95,108,111,97,100,101,114,99,1,0,0,0,0,0,0, + 0,2,0,0,0,3,0,0,0,3,0,0,0,115,35,0, + 0,0,135,0,0,102,1,0,100,1,0,100,2,0,134,0, + 0,125,1,0,116,0,0,124,1,0,136,0,0,131,2,0, + 1,124,1,0,83,40,3,0,0,0,117,42,3,0,0,68, + 101,99,111,114,97,116,111,114,32,116,111,32,104,97,110,100, + 108,101,32,115,101,108,101,99,116,105,110,103,32,116,104,101, + 32,112,114,111,112,101,114,32,109,111,100,117,108,101,32,102, + 111,114,32,108,111,97,100,101,114,115,46,10,10,32,32,32, + 32,84,104,101,32,100,101,99,111,114,97,116,101,100,32,102, + 117,110,99,116,105,111,110,32,105,115,32,112,97,115,115,101, + 100,32,116,104,101,32,109,111,100,117,108,101,32,116,111,32, + 117,115,101,32,105,110,115,116,101,97,100,32,111,102,32,116, + 104,101,32,109,111,100,117,108,101,10,32,32,32,32,110,97, + 109,101,46,32,84,104,101,32,109,111,100,117,108,101,32,112, + 97,115,115,101,100,32,105,110,32,116,111,32,116,104,101,32, + 102,117,110,99,116,105,111,110,32,105,115,32,101,105,116,104, + 101,114,32,102,114,111,109,32,115,121,115,46,109,111,100,117, + 108,101,115,32,105,102,10,32,32,32,32,105,116,32,97,108, + 114,101,97,100,121,32,101,120,105,115,116,115,32,111,114,32, + 105,115,32,97,32,110,101,119,32,109,111,100,117,108,101,46, + 32,73,102,32,116,104,101,32,109,111,100,117,108,101,32,105, + 115,32,110,101,119,44,32,116,104,101,110,32,95,95,110,97, + 109,101,95,95,10,32,32,32,32,105,115,32,115,101,116,32, + 116,104,101,32,102,105,114,115,116,32,97,114,103,117,109,101, + 110,116,32,116,111,32,116,104,101,32,109,101,116,104,111,100, + 44,32,95,95,108,111,97,100,101,114,95,95,32,105,115,32, + 115,101,116,32,116,111,32,115,101,108,102,44,32,97,110,100, + 10,32,32,32,32,95,95,112,97,99,107,97,103,101,95,95, + 32,105,115,32,115,101,116,32,97,99,99,111,114,100,105,110, + 103,108,121,32,40,105,102,32,115,101,108,102,46,105,115,95, + 112,97,99,107,97,103,101,40,41,32,105,115,32,100,101,102, + 105,110,101,100,41,32,119,105,108,108,32,98,101,32,115,101, + 116,10,32,32,32,32,98,101,102,111,114,101,32,105,116,32, + 105,115,32,112,97,115,115,101,100,32,116,111,32,116,104,101, + 32,100,101,99,111,114,97,116,101,100,32,102,117,110,99,116, + 105,111,110,32,40,105,102,32,115,101,108,102,46,105,115,95, + 112,97,99,107,97,103,101,40,41,32,100,111,101,115,10,32, + 32,32,32,110,111,116,32,119,111,114,107,32,102,111,114,32, + 116,104,101,32,109,111,100,117,108,101,32,105,116,32,119,105, + 108,108,32,98,101,32,115,101,116,32,112,111,115,116,45,108, + 111,97,100,41,46,10,10,32,32,32,32,73,102,32,97,110, + 32,101,120,99,101,112,116,105,111,110,32,105,115,32,114,97, + 105,115,101,100,32,97,110,100,32,116,104,101,32,100,101,99, + 111,114,97,116,111,114,32,99,114,101,97,116,101,100,32,116, + 104,101,32,109,111,100,117,108,101,32,105,116,32,105,115,10, + 32,32,32,32,115,117,98,115,101,113,117,101,110,116,108,121, + 32,114,101,109,111,118,101,100,32,102,114,111,109,32,115,121, + 115,46,109,111,100,117,108,101,115,46,10,10,32,32,32,32, + 84,104,101,32,100,101,99,111,114,97,116,111,114,32,97,115, + 115,117,109,101,115,32,116,104,97,116,32,116,104,101,32,100, + 101,99,111,114,97,116,101,100,32,102,117,110,99,116,105,111, + 110,32,116,97,107,101,115,32,116,104,101,32,109,111,100,117, + 108,101,32,110,97,109,101,32,97,115,10,32,32,32,32,116, + 104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101, + 110,116,46,10,10,32,32,32,32,99,2,0,0,0,0,0, + 0,0,7,0,0,0,25,0,0,0,31,0,0,0,115,254, + 0,0,0,116,0,0,106,1,0,106,2,0,124,1,0,131, + 1,0,125,4,0,124,4,0,100,0,0,107,9,0,125,5, + 0,124,5,0,115,168,0,116,3,0,124,1,0,131,1,0, + 125,4,0,100,1,0,124,4,0,95,4,0,124,4,0,116, + 0,0,106,1,0,124,1,0,60,124,0,0,124,4,0,95, + 5,0,121,19,0,124,0,0,106,6,0,124,1,0,131,1, + 0,125,6,0,87,110,24,0,4,116,7,0,116,8,0,102, + 2,0,107,10,0,114,124,0,1,1,1,89,113,177,0,88, + 124,6,0,114,143,0,124,1,0,124,4,0,95,9,0,113, + 177,0,124,1,0,106,10,0,100,2,0,131,1,0,100,3, + 0,25,124,4,0,95,9,0,110,9,0,100,1,0,124,4, + 0,95,4,0,122,60,0,121,23,0,136,0,0,124,0,0, + 124,4,0,124,2,0,124,3,0,142,2,0,83,87,110,30, + 0,1,1,1,124,5,0,115,228,0,116,0,0,106,1,0, + 124,1,0,61,110,0,0,130,0,0,89,110,1,0,88,87, + 100,0,0,100,4,0,124,4,0,95,4,0,88,100,0,0, + 83,40,5,0,0,0,78,84,117,1,0,0,0,46,105,0, + 0,0,0,70,40,11,0,0,0,117,3,0,0,0,115,121, + 115,117,7,0,0,0,109,111,100,117,108,101,115,117,3,0, + 0,0,103,101,116,117,10,0,0,0,110,101,119,95,109,111, + 100,117,108,101,117,16,0,0,0,95,95,105,110,105,116,105, + 97,108,105,122,105,110,103,95,95,117,10,0,0,0,95,95, + 108,111,97,100,101,114,95,95,117,10,0,0,0,105,115,95, + 112,97,99,107,97,103,101,117,11,0,0,0,73,109,112,111, + 114,116,69,114,114,111,114,117,14,0,0,0,65,116,116,114, + 105,98,117,116,101,69,114,114,111,114,117,11,0,0,0,95, + 95,112,97,99,107,97,103,101,95,95,117,10,0,0,0,114, + 112,97,114,116,105,116,105,111,110,40,7,0,0,0,117,4, + 0,0,0,115,101,108,102,117,8,0,0,0,102,117,108,108, + 110,97,109,101,117,4,0,0,0,97,114,103,115,117,6,0, + 0,0,107,119,97,114,103,115,117,6,0,0,0,109,111,100, + 117,108,101,117,9,0,0,0,105,115,95,114,101,108,111,97, + 100,117,10,0,0,0,105,115,95,112,97,99,107,97,103,101, + 40,1,0,0,0,117,3,0,0,0,102,120,110,40,0,0, + 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, + 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, + 114,97,112,62,117,25,0,0,0,109,111,100,117,108,101,95, + 102,111,114,95,108,111,97,100,101,114,95,119,114,97,112,112, + 101,114,26,2,0,0,115,44,0,0,0,0,1,18,1,12, + 1,6,4,12,3,9,1,13,1,9,1,3,1,19,1,19, + 1,5,2,6,1,12,2,25,2,9,1,6,2,23,1,3, + 1,6,1,13,1,12,2,117,52,0,0,0,109,111,100,117, + 108,101,95,102,111,114,95,108,111,97,100,101,114,46,60,108, + 111,99,97,108,115,62,46,109,111,100,117,108,101,95,102,111, + 114,95,108,111,97,100,101,114,95,119,114,97,112,112,101,114, + 40,1,0,0,0,117,5,0,0,0,95,119,114,97,112,40, + 2,0,0,0,117,3,0,0,0,102,120,110,117,25,0,0, + 0,109,111,100,117,108,101,95,102,111,114,95,108,111,97,100, + 101,114,95,119,114,97,112,112,101,114,40,0,0,0,0,40, + 1,0,0,0,117,3,0,0,0,102,120,110,117,29,0,0, + 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, + 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,17, + 0,0,0,109,111,100,117,108,101,95,102,111,114,95,108,111, + 97,100,101,114,8,2,0,0,115,6,0,0,0,0,18,18, + 33,13,1,117,17,0,0,0,109,111,100,117,108,101,95,102, + 111,114,95,108,111,97,100,101,114,99,1,0,0,0,0,0, + 0,0,2,0,0,0,4,0,0,0,3,0,0,0,115,38, + 0,0,0,100,1,0,135,0,0,102,1,0,100,2,0,100, + 3,0,134,1,0,125,1,0,116,0,0,124,1,0,136,0, + 0,131,2,0,1,124,1,0,83,40,4,0,0,0,117,252, + 0,0,0,68,101,99,111,114,97,116,111,114,32,116,111,32, + 118,101,114,105,102,121,32,116,104,97,116,32,116,104,101,32, + 109,111,100,117,108,101,32,98,101,105,110,103,32,114,101,113, + 117,101,115,116,101,100,32,109,97,116,99,104,101,115,32,116, + 104,101,32,111,110,101,32,116,104,101,10,32,32,32,32,108, + 111,97,100,101,114,32,99,97,110,32,104,97,110,100,108,101, + 46,10,10,32,32,32,32,84,104,101,32,102,105,114,115,116, + 32,97,114,103,117,109,101,110,116,32,40,115,101,108,102,41, + 32,109,117,115,116,32,100,101,102,105,110,101,32,95,110,97, + 109,101,32,119,104,105,99,104,32,116,104,101,32,115,101,99, + 111,110,100,32,97,114,103,117,109,101,110,116,32,105,115,10, + 32,32,32,32,99,111,109,112,97,114,101,100,32,97,103,97, + 105,110,115,116,46,32,73,102,32,116,104,101,32,99,111,109, + 112,97,114,105,115,111,110,32,102,97,105,108,115,32,116,104, + 101,110,32,73,109,112,111,114,116,69,114,114,111,114,32,105, + 115,32,114,97,105,115,101,100,46,10,10,32,32,32,32,78, + 99,2,0,0,0,0,0,0,0,4,0,0,0,5,0,0, + 0,31,0,0,0,115,83,0,0,0,124,1,0,100,0,0, + 107,8,0,114,24,0,124,0,0,106,0,0,125,1,0,110, + 40,0,124,0,0,106,0,0,124,1,0,107,3,0,114,64, + 0,116,1,0,100,1,0,124,1,0,22,100,2,0,124,1, + 0,131,1,1,130,1,0,110,0,0,136,0,0,124,0,0, + 124,1,0,124,2,0,124,3,0,142,2,0,83,40,3,0, + 0,0,78,117,23,0,0,0,108,111,97,100,101,114,32,99, + 97,110,110,111,116,32,104,97,110,100,108,101,32,37,115,117, + 4,0,0,0,110,97,109,101,40,2,0,0,0,117,4,0, + 0,0,110,97,109,101,117,11,0,0,0,73,109,112,111,114, + 116,69,114,114,111,114,40,4,0,0,0,117,4,0,0,0, + 115,101,108,102,117,4,0,0,0,110,97,109,101,117,4,0, + 0,0,97,114,103,115,117,6,0,0,0,107,119,97,114,103, + 115,40,1,0,0,0,117,6,0,0,0,109,101,116,104,111, + 100,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, + 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, + 111,116,115,116,114,97,112,62,117,19,0,0,0,95,99,104, + 101,99,107,95,110,97,109,101,95,119,114,97,112,112,101,114, + 71,2,0,0,115,10,0,0,0,0,1,12,1,12,1,15, + 1,25,1,117,40,0,0,0,95,99,104,101,99,107,95,110, + 97,109,101,46,60,108,111,99,97,108,115,62,46,95,99,104, + 101,99,107,95,110,97,109,101,95,119,114,97,112,112,101,114, + 40,1,0,0,0,117,5,0,0,0,95,119,114,97,112,40, + 2,0,0,0,117,6,0,0,0,109,101,116,104,111,100,117, + 19,0,0,0,95,99,104,101,99,107,95,110,97,109,101,95, + 119,114,97,112,112,101,114,40,0,0,0,0,40,1,0,0, + 0,117,6,0,0,0,109,101,116,104,111,100,117,29,0,0, + 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, + 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,11, + 0,0,0,95,99,104,101,99,107,95,110,97,109,101,63,2, + 0,0,115,6,0,0,0,0,8,21,6,13,1,117,11,0, + 0,0,95,99,104,101,99,107,95,110,97,109,101,99,1,0, + 0,0,0,0,0,0,2,0,0,0,3,0,0,0,3,0, + 0,0,115,35,0,0,0,135,0,0,102,1,0,100,1,0, + 100,2,0,134,0,0,125,1,0,116,0,0,124,1,0,136, + 0,0,131,2,0,1,124,1,0,83,40,3,0,0,0,117, + 49,0,0,0,68,101,99,111,114,97,116,111,114,32,116,111, + 32,118,101,114,105,102,121,32,116,104,101,32,110,97,109,101, + 100,32,109,111,100,117,108,101,32,105,115,32,98,117,105,108, + 116,45,105,110,46,99,2,0,0,0,0,0,0,0,2,0, + 0,0,4,0,0,0,19,0,0,0,115,58,0,0,0,124, + 1,0,116,0,0,106,1,0,107,7,0,114,45,0,116,2, + 0,100,1,0,106,3,0,124,1,0,131,1,0,100,2,0, + 124,1,0,131,1,1,130,1,0,110,0,0,136,0,0,124, + 0,0,124,1,0,131,2,0,83,40,3,0,0,0,78,117, + 27,0,0,0,123,125,32,105,115,32,110,111,116,32,97,32, + 98,117,105,108,116,45,105,110,32,109,111,100,117,108,101,117, + 4,0,0,0,110,97,109,101,40,4,0,0,0,117,3,0, + 0,0,115,121,115,117,20,0,0,0,98,117,105,108,116,105, + 110,95,109,111,100,117,108,101,95,110,97,109,101,115,117,11, + 0,0,0,73,109,112,111,114,116,69,114,114,111,114,117,6, + 0,0,0,102,111,114,109,97,116,40,2,0,0,0,117,4, + 0,0,0,115,101,108,102,117,8,0,0,0,102,117,108,108, + 110,97,109,101,40,1,0,0,0,117,3,0,0,0,102,120, + 110,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, + 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, + 111,116,115,116,114,97,112,62,117,25,0,0,0,95,114,101, + 113,117,105,114,101,115,95,98,117,105,108,116,105,110,95,119, + 114,97,112,112,101,114,83,2,0,0,115,8,0,0,0,0, + 1,15,1,18,1,12,1,117,52,0,0,0,95,114,101,113, + 117,105,114,101,115,95,98,117,105,108,116,105,110,46,60,108, + 111,99,97,108,115,62,46,95,114,101,113,117,105,114,101,115, + 95,98,117,105,108,116,105,110,95,119,114,97,112,112,101,114, + 40,1,0,0,0,117,5,0,0,0,95,119,114,97,112,40, + 2,0,0,0,117,3,0,0,0,102,120,110,117,25,0,0, + 0,95,114,101,113,117,105,114,101,115,95,98,117,105,108,116, + 105,110,95,119,114,97,112,112,101,114,40,0,0,0,0,40, + 1,0,0,0,117,3,0,0,0,102,120,110,117,29,0,0, + 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, + 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,17, + 0,0,0,95,114,101,113,117,105,114,101,115,95,98,117,105, + 108,116,105,110,81,2,0,0,115,6,0,0,0,0,2,18, + 5,13,1,117,17,0,0,0,95,114,101,113,117,105,114,101, + 115,95,98,117,105,108,116,105,110,99,1,0,0,0,0,0, + 0,0,2,0,0,0,3,0,0,0,3,0,0,0,115,35, + 0,0,0,135,0,0,102,1,0,100,1,0,100,2,0,134, + 0,0,125,1,0,116,0,0,124,1,0,136,0,0,131,2, + 0,1,124,1,0,83,40,3,0,0,0,117,47,0,0,0, + 68,101,99,111,114,97,116,111,114,32,116,111,32,118,101,114, + 105,102,121,32,116,104,101,32,110,97,109,101,100,32,109,111, + 100,117,108,101,32,105,115,32,102,114,111,122,101,110,46,99, + 2,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, + 19,0,0,0,115,58,0,0,0,116,0,0,106,1,0,124, + 1,0,131,1,0,115,45,0,116,2,0,100,1,0,106,3, + 0,124,1,0,131,1,0,100,2,0,124,1,0,131,1,1, + 130,1,0,110,0,0,136,0,0,124,0,0,124,1,0,131, + 2,0,83,40,3,0,0,0,78,117,25,0,0,0,123,125, + 32,105,115,32,110,111,116,32,97,32,102,114,111,122,101,110, + 32,109,111,100,117,108,101,117,4,0,0,0,110,97,109,101, + 40,4,0,0,0,117,4,0,0,0,95,105,109,112,117,9, + 0,0,0,105,115,95,102,114,111,122,101,110,117,11,0,0, + 0,73,109,112,111,114,116,69,114,114,111,114,117,6,0,0, + 0,102,111,114,109,97,116,40,2,0,0,0,117,4,0,0, + 0,115,101,108,102,117,8,0,0,0,102,117,108,108,110,97, + 109,101,40,1,0,0,0,117,3,0,0,0,102,120,110,40, + 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, + 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, + 115,116,114,97,112,62,117,24,0,0,0,95,114,101,113,117, + 105,114,101,115,95,102,114,111,122,101,110,95,119,114,97,112, + 112,101,114,94,2,0,0,115,8,0,0,0,0,1,15,1, + 18,1,12,1,117,50,0,0,0,95,114,101,113,117,105,114, + 101,115,95,102,114,111,122,101,110,46,60,108,111,99,97,108, + 115,62,46,95,114,101,113,117,105,114,101,115,95,102,114,111, + 122,101,110,95,119,114,97,112,112,101,114,40,1,0,0,0, + 117,5,0,0,0,95,119,114,97,112,40,2,0,0,0,117, + 3,0,0,0,102,120,110,117,24,0,0,0,95,114,101,113, + 117,105,114,101,115,95,102,114,111,122,101,110,95,119,114,97, + 112,112,101,114,40,0,0,0,0,40,1,0,0,0,117,3, + 0,0,0,102,120,110,117,29,0,0,0,60,102,114,111,122, + 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, + 111,116,115,116,114,97,112,62,117,16,0,0,0,95,114,101, + 113,117,105,114,101,115,95,102,114,111,122,101,110,92,2,0, + 0,115,6,0,0,0,0,2,18,5,13,1,117,16,0,0, + 0,95,114,101,113,117,105,114,101,115,95,102,114,111,122,101, + 110,99,2,0,0,0,0,0,0,0,5,0,0,0,5,0, + 0,0,67,0,0,0,115,87,0,0,0,124,0,0,106,0, + 0,124,1,0,131,1,0,92,2,0,125,2,0,125,3,0, + 124,2,0,100,1,0,107,8,0,114,83,0,116,1,0,124, + 3,0,131,1,0,114,83,0,100,2,0,125,4,0,116,2, + 0,106,3,0,124,4,0,106,4,0,124,3,0,100,3,0, + 25,131,1,0,116,5,0,131,2,0,1,110,0,0,124,2, + 0,83,40,4,0,0,0,117,86,0,0,0,84,114,121,32, + 116,111,32,102,105,110,100,32,97,32,108,111,97,100,101,114, + 32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105, + 101,100,32,109,111,100,117,108,101,32,98,121,32,100,101,108, + 101,103,97,116,105,110,103,32,116,111,10,32,32,32,32,115, + 101,108,102,46,102,105,110,100,95,108,111,97,100,101,114,40, + 41,46,78,117,44,0,0,0,78,111,116,32,105,109,112,111, + 114,116,105,110,103,32,100,105,114,101,99,116,111,114,121,32, + 123,125,58,32,109,105,115,115,105,110,103,32,95,95,105,110, + 105,116,95,95,105,0,0,0,0,40,6,0,0,0,117,11, + 0,0,0,102,105,110,100,95,108,111,97,100,101,114,117,3, + 0,0,0,108,101,110,117,9,0,0,0,95,119,97,114,110, + 105,110,103,115,117,4,0,0,0,119,97,114,110,117,6,0, + 0,0,102,111,114,109,97,116,117,13,0,0,0,73,109,112, + 111,114,116,87,97,114,110,105,110,103,40,5,0,0,0,117, + 4,0,0,0,115,101,108,102,117,8,0,0,0,102,117,108, + 108,110,97,109,101,117,6,0,0,0,108,111,97,100,101,114, + 117,8,0,0,0,112,111,114,116,105,111,110,115,117,3,0, + 0,0,109,115,103,40,0,0,0,0,40,0,0,0,0,117, 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, - 62,117,16,0,0,0,95,114,101,113,117,105,114,101,115,95, - 102,114,111,122,101,110,90,2,0,0,115,6,0,0,0,0, - 2,18,5,13,1,117,16,0,0,0,95,114,101,113,117,105, - 114,101,115,95,102,114,111,122,101,110,99,2,0,0,0,0, - 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, - 87,0,0,0,124,0,0,106,0,0,124,1,0,131,1,0, - 92,2,0,125,2,0,125,3,0,124,2,0,100,1,0,107, - 8,0,114,83,0,116,1,0,124,3,0,131,1,0,114,83, - 0,100,2,0,125,4,0,116,2,0,106,3,0,124,4,0, - 106,4,0,124,3,0,100,3,0,25,131,1,0,116,5,0, - 131,2,0,1,110,0,0,124,2,0,83,40,4,0,0,0, - 117,86,0,0,0,84,114,121,32,116,111,32,102,105,110,100, - 32,97,32,108,111,97,100,101,114,32,102,111,114,32,116,104, - 101,32,115,112,101,99,105,102,105,101,100,32,109,111,100,117, - 108,101,32,98,121,32,100,101,108,101,103,97,116,105,110,103, - 32,116,111,10,32,32,32,32,115,101,108,102,46,102,105,110, - 100,95,108,111,97,100,101,114,40,41,46,78,117,44,0,0, - 0,78,111,116,32,105,109,112,111,114,116,105,110,103,32,100, - 105,114,101,99,116,111,114,121,32,123,125,58,32,109,105,115, - 115,105,110,103,32,95,95,105,110,105,116,95,95,105,0,0, - 0,0,40,6,0,0,0,117,11,0,0,0,102,105,110,100, - 95,108,111,97,100,101,114,117,3,0,0,0,108,101,110,117, - 9,0,0,0,95,119,97,114,110,105,110,103,115,117,4,0, - 0,0,119,97,114,110,117,6,0,0,0,102,111,114,109,97, - 116,117,13,0,0,0,73,109,112,111,114,116,87,97,114,110, - 105,110,103,40,5,0,0,0,117,4,0,0,0,115,101,108, - 102,117,8,0,0,0,102,117,108,108,110,97,109,101,117,6, - 0,0,0,108,111,97,100,101,114,117,8,0,0,0,112,111, - 114,116,105,111,110,115,117,3,0,0,0,109,115,103,40,0, - 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, - 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, - 98,111,111,116,115,116,114,97,112,62,117,17,0,0,0,95, + 62,117,17,0,0,0,95,102,105,110,100,95,109,111,100,117, + 108,101,95,115,104,105,109,103,2,0,0,115,10,0,0,0, + 0,6,21,1,24,1,6,1,32,1,117,17,0,0,0,95, 102,105,110,100,95,109,111,100,117,108,101,95,115,104,105,109, - 101,2,0,0,115,10,0,0,0,0,6,21,1,24,1,6, - 1,32,1,117,17,0,0,0,95,102,105,110,100,95,109,111, - 100,117,108,101,95,115,104,105,109,99,4,0,0,0,0,0, - 0,0,12,0,0,0,19,0,0,0,67,0,0,0,115,233, - 1,0,0,105,0,0,125,4,0,124,2,0,100,1,0,107, - 9,0,114,31,0,124,2,0,124,4,0,100,2,0,60,110, - 6,0,100,3,0,125,2,0,124,3,0,100,1,0,107,9, - 0,114,62,0,124,3,0,124,4,0,100,4,0,60,110,0, - 0,124,0,0,100,1,0,100,5,0,133,2,0,25,125,5, - 0,124,0,0,100,5,0,100,6,0,133,2,0,25,125,6, - 0,124,0,0,100,6,0,100,7,0,133,2,0,25,125,7, - 0,124,5,0,116,0,0,107,3,0,114,158,0,100,8,0, - 106,1,0,124,2,0,124,5,0,131,2,0,125,8,0,116, - 2,0,124,8,0,124,4,0,141,1,0,130,1,0,110,116, - 0,116,3,0,124,6,0,131,1,0,100,5,0,107,3,0, - 114,216,0,100,9,0,106,1,0,124,2,0,131,1,0,125, - 9,0,116,4,0,124,9,0,131,1,0,1,116,5,0,124, - 9,0,131,1,0,130,1,0,110,58,0,116,3,0,124,7, - 0,131,1,0,100,5,0,107,3,0,114,18,1,100,10,0, - 106,1,0,124,2,0,131,1,0,125,9,0,116,4,0,124, - 9,0,131,1,0,1,116,5,0,124,9,0,131,1,0,130, - 1,0,110,0,0,124,1,0,100,1,0,107,9,0,114,219, - 1,121,20,0,116,6,0,124,1,0,100,11,0,25,131,1, - 0,125,10,0,87,110,18,0,4,116,7,0,107,10,0,114, - 70,1,1,1,1,89,110,62,0,88,116,8,0,124,6,0, - 131,1,0,124,10,0,107,3,0,114,132,1,100,12,0,106, - 1,0,124,2,0,131,1,0,125,9,0,116,4,0,124,9, - 0,131,1,0,1,116,2,0,124,9,0,124,4,0,141,1, - 0,130,1,0,110,0,0,121,18,0,124,1,0,100,13,0, - 25,100,14,0,64,125,11,0,87,110,18,0,4,116,7,0, - 107,10,0,114,170,1,1,1,1,89,113,219,1,88,116,8, - 0,124,7,0,131,1,0,124,11,0,107,3,0,114,219,1, - 116,2,0,100,12,0,106,1,0,124,2,0,131,1,0,124, - 4,0,141,1,0,130,1,0,113,219,1,110,0,0,124,0, - 0,100,7,0,100,1,0,133,2,0,25,83,40,15,0,0, - 0,117,122,1,0,0,86,97,108,105,100,97,116,101,32,116, - 104,101,32,104,101,97,100,101,114,32,111,102,32,116,104,101, - 32,112,97,115,115,101,100,45,105,110,32,98,121,116,101,99, - 111,100,101,32,97,103,97,105,110,115,116,32,115,111,117,114, - 99,101,95,115,116,97,116,115,32,40,105,102,10,32,32,32, - 32,103,105,118,101,110,41,32,97,110,100,32,114,101,116,117, - 114,110,105,110,103,32,116,104,101,32,98,121,116,101,99,111, - 100,101,32,116,104,97,116,32,99,97,110,32,98,101,32,99, - 111,109,112,105,108,101,100,32,98,121,32,99,111,109,112,105, - 108,101,40,41,46,10,10,32,32,32,32,65,108,108,32,111, - 116,104,101,114,32,97,114,103,117,109,101,110,116,115,32,97, - 114,101,32,117,115,101,100,32,116,111,32,101,110,104,97,110, - 99,101,32,101,114,114,111,114,32,114,101,112,111,114,116,105, - 110,103,46,10,10,32,32,32,32,73,109,112,111,114,116,69, - 114,114,111,114,32,105,115,32,114,97,105,115,101,100,32,119, - 104,101,110,32,116,104,101,32,109,97,103,105,99,32,110,117, - 109,98,101,114,32,105,115,32,105,110,99,111,114,114,101,99, - 116,32,111,114,32,116,104,101,32,98,121,116,101,99,111,100, - 101,32,105,115,10,32,32,32,32,102,111,117,110,100,32,116, - 111,32,98,101,32,115,116,97,108,101,46,32,69,79,70,69, - 114,114,111,114,32,105,115,32,114,97,105,115,101,100,32,119, - 104,101,110,32,116,104,101,32,100,97,116,97,32,105,115,32, - 102,111,117,110,100,32,116,111,32,98,101,10,32,32,32,32, - 116,114,117,110,99,97,116,101,100,46,10,10,32,32,32,32, - 78,117,4,0,0,0,110,97,109,101,117,10,0,0,0,60, - 98,121,116,101,99,111,100,101,62,117,4,0,0,0,112,97, - 116,104,105,4,0,0,0,105,8,0,0,0,105,12,0,0, - 0,117,37,0,0,0,105,110,99,111,109,112,108,101,116,101, - 32,109,97,103,105,99,32,110,117,109,98,101,114,32,105,110, - 32,123,33,114,125,58,32,123,33,114,125,117,28,0,0,0, - 105,110,99,111,109,112,108,101,116,101,32,116,105,109,101,115, - 116,97,109,112,32,105,110,32,123,33,114,125,117,23,0,0, - 0,105,110,99,111,109,112,108,101,116,101,32,115,105,122,101, + 99,4,0,0,0,0,0,0,0,12,0,0,0,19,0,0, + 0,67,0,0,0,115,233,1,0,0,105,0,0,125,4,0, + 124,2,0,100,1,0,107,9,0,114,31,0,124,2,0,124, + 4,0,100,2,0,60,110,6,0,100,3,0,125,2,0,124, + 3,0,100,1,0,107,9,0,114,62,0,124,3,0,124,4, + 0,100,4,0,60,110,0,0,124,0,0,100,1,0,100,5, + 0,133,2,0,25,125,5,0,124,0,0,100,5,0,100,6, + 0,133,2,0,25,125,6,0,124,0,0,100,6,0,100,7, + 0,133,2,0,25,125,7,0,124,5,0,116,0,0,107,3, + 0,114,158,0,100,8,0,106,1,0,124,2,0,124,5,0, + 131,2,0,125,8,0,116,2,0,124,8,0,124,4,0,141, + 1,0,130,1,0,110,116,0,116,3,0,124,6,0,131,1, + 0,100,5,0,107,3,0,114,216,0,100,9,0,106,1,0, + 124,2,0,131,1,0,125,9,0,116,4,0,124,9,0,131, + 1,0,1,116,5,0,124,9,0,131,1,0,130,1,0,110, + 58,0,116,3,0,124,7,0,131,1,0,100,5,0,107,3, + 0,114,18,1,100,10,0,106,1,0,124,2,0,131,1,0, + 125,9,0,116,4,0,124,9,0,131,1,0,1,116,5,0, + 124,9,0,131,1,0,130,1,0,110,0,0,124,1,0,100, + 1,0,107,9,0,114,219,1,121,20,0,116,6,0,124,1, + 0,100,11,0,25,131,1,0,125,10,0,87,110,18,0,4, + 116,7,0,107,10,0,114,70,1,1,1,1,89,110,62,0, + 88,116,8,0,124,6,0,131,1,0,124,10,0,107,3,0, + 114,132,1,100,12,0,106,1,0,124,2,0,131,1,0,125, + 9,0,116,4,0,124,9,0,131,1,0,1,116,2,0,124, + 9,0,124,4,0,141,1,0,130,1,0,110,0,0,121,18, + 0,124,1,0,100,13,0,25,100,14,0,64,125,11,0,87, + 110,18,0,4,116,7,0,107,10,0,114,170,1,1,1,1, + 89,113,219,1,88,116,8,0,124,7,0,131,1,0,124,11, + 0,107,3,0,114,219,1,116,2,0,100,12,0,106,1,0, + 124,2,0,131,1,0,124,4,0,141,1,0,130,1,0,113, + 219,1,110,0,0,124,0,0,100,7,0,100,1,0,133,2, + 0,25,83,40,15,0,0,0,117,122,1,0,0,86,97,108, + 105,100,97,116,101,32,116,104,101,32,104,101,97,100,101,114, + 32,111,102,32,116,104,101,32,112,97,115,115,101,100,45,105, + 110,32,98,121,116,101,99,111,100,101,32,97,103,97,105,110, + 115,116,32,115,111,117,114,99,101,95,115,116,97,116,115,32, + 40,105,102,10,32,32,32,32,103,105,118,101,110,41,32,97, + 110,100,32,114,101,116,117,114,110,105,110,103,32,116,104,101, + 32,98,121,116,101,99,111,100,101,32,116,104,97,116,32,99, + 97,110,32,98,101,32,99,111,109,112,105,108,101,100,32,98, + 121,32,99,111,109,112,105,108,101,40,41,46,10,10,32,32, + 32,32,65,108,108,32,111,116,104,101,114,32,97,114,103,117, + 109,101,110,116,115,32,97,114,101,32,117,115,101,100,32,116, + 111,32,101,110,104,97,110,99,101,32,101,114,114,111,114,32, + 114,101,112,111,114,116,105,110,103,46,10,10,32,32,32,32, + 73,109,112,111,114,116,69,114,114,111,114,32,105,115,32,114, + 97,105,115,101,100,32,119,104,101,110,32,116,104,101,32,109, + 97,103,105,99,32,110,117,109,98,101,114,32,105,115,32,105, + 110,99,111,114,114,101,99,116,32,111,114,32,116,104,101,32, + 98,121,116,101,99,111,100,101,32,105,115,10,32,32,32,32, + 102,111,117,110,100,32,116,111,32,98,101,32,115,116,97,108, + 101,46,32,69,79,70,69,114,114,111,114,32,105,115,32,114, + 97,105,115,101,100,32,119,104,101,110,32,116,104,101,32,100, + 97,116,97,32,105,115,32,102,111,117,110,100,32,116,111,32, + 98,101,10,32,32,32,32,116,114,117,110,99,97,116,101,100, + 46,10,10,32,32,32,32,78,117,4,0,0,0,110,97,109, + 101,117,8,0,0,0,98,121,116,101,99,111,100,101,117,4, + 0,0,0,112,97,116,104,105,4,0,0,0,105,8,0,0, + 0,105,12,0,0,0,117,30,0,0,0,98,97,100,32,109, + 97,103,105,99,32,110,117,109,98,101,114,32,105,110,32,123, + 33,114,125,58,32,123,33,114,125,117,21,0,0,0,98,97, + 100,32,116,105,109,101,115,116,97,109,112,32,105,110,32,123, + 33,114,125,117,16,0,0,0,98,97,100,32,115,105,122,101, 32,105,110,32,123,33,114,125,117,5,0,0,0,109,116,105, 109,101,117,26,0,0,0,98,121,116,101,99,111,100,101,32, 105,115,32,115,116,97,108,101,32,102,111,114,32,123,33,114, @@ -1444,7 +1444,7 @@ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, 46,95,98,111,111,116,115,116,114,97,112,62,117,25,0,0, 0,95,118,97,108,105,100,97,116,101,95,98,121,116,101,99, - 111,100,101,95,104,101,97,100,101,114,114,2,0,0,115,74, + 111,100,101,95,104,101,97,100,101,114,116,2,0,0,115,74, 0,0,0,0,11,6,1,12,1,13,3,6,1,12,1,13, 1,16,1,16,1,16,1,12,1,18,1,18,1,18,1,15, 1,10,1,15,1,18,1,15,1,10,1,15,1,12,1,3, @@ -1486,7 +1486,7 @@ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, 46,95,98,111,111,116,115,116,114,97,112,62,117,17,0,0, 0,95,99,111,109,112,105,108,101,95,98,121,116,101,99,111, - 100,101,168,2,0,0,115,16,0,0,0,0,2,15,1,15, + 100,101,170,2,0,0,115,16,0,0,0,0,2,15,1,15, 1,13,1,12,1,19,1,4,2,18,1,117,17,0,0,0, 95,99,111,109,112,105,108,101,95,98,121,116,101,99,111,100, 101,99,1,0,0,0,0,0,0,0,1,0,0,0,6,0, @@ -1524,7 +1524,7 @@ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, 114,97,112,62,117,11,0,0,0,109,111,100,117,108,101,95, - 114,101,112,114,192,2,0,0,115,2,0,0,0,0,2,117, + 114,101,112,114,194,2,0,0,115,2,0,0,0,0,2,117, 27,0,0,0,66,117,105,108,116,105,110,73,109,112,111,114, 116,101,114,46,109,111,100,117,108,101,95,114,101,112,114,78, 99,3,0,0,0,0,0,0,0,3,0,0,0,2,0,0, @@ -1546,7 +1546,7 @@ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, 111,111,116,115,116,114,97,112,62,117,11,0,0,0,102,105, - 110,100,95,109,111,100,117,108,101,196,2,0,0,115,6,0, + 110,100,95,109,111,100,117,108,101,198,2,0,0,115,6,0, 0,0,0,7,12,1,4,1,117,27,0,0,0,66,117,105, 108,116,105,110,73,109,112,111,114,116,101,114,46,102,105,110, 100,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, @@ -1570,7 +1570,7 @@ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, 62,117,11,0,0,0,108,111,97,100,95,109,111,100,117,108, - 101,207,2,0,0,115,14,0,0,0,0,6,15,1,3,1, + 101,209,2,0,0,115,14,0,0,0,0,6,15,1,3,1, 20,1,3,1,22,1,13,1,117,27,0,0,0,66,117,105, 108,116,105,110,73,109,112,111,114,116,101,114,46,108,111,97, 100,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, @@ -1585,7 +1585,7 @@ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, 116,114,97,112,62,117,8,0,0,0,103,101,116,95,99,111, - 100,101,221,2,0,0,115,2,0,0,0,0,4,117,24,0, + 100,101,223,2,0,0,115,2,0,0,0,0,4,117,24,0, 0,0,66,117,105,108,116,105,110,73,109,112,111,114,116,101, 114,46,103,101,116,95,99,111,100,101,99,2,0,0,0,0, 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, @@ -1599,7 +1599,7 @@ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, 115,116,114,97,112,62,117,10,0,0,0,103,101,116,95,115, - 111,117,114,99,101,227,2,0,0,115,2,0,0,0,0,4, + 111,117,114,99,101,229,2,0,0,115,2,0,0,0,0,4, 117,26,0,0,0,66,117,105,108,116,105,110,73,109,112,111, 114,116,101,114,46,103,101,116,95,115,111,117,114,99,101,99, 2,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, @@ -1613,7 +1613,7 @@ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, 116,115,116,114,97,112,62,117,10,0,0,0,105,115,95,112, - 97,99,107,97,103,101,233,2,0,0,115,2,0,0,0,0, + 97,99,107,97,103,101,235,2,0,0,115,2,0,0,0,0, 4,117,26,0,0,0,66,117,105,108,116,105,110,73,109,112, 111,114,116,101,114,46,105,115,95,112,97,99,107,97,103,101, 40,14,0,0,0,117,8,0,0,0,95,95,110,97,109,101, @@ -1635,7 +1635,7 @@ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,15, 0,0,0,66,117,105,108,116,105,110,73,109,112,111,114,116, - 101,114,183,2,0,0,115,28,0,0,0,16,7,6,2,18, + 101,114,185,2,0,0,115,28,0,0,0,16,7,6,2,18, 4,3,1,18,10,3,1,3,1,3,1,27,11,3,1,21, 5,3,1,21,5,3,1,117,15,0,0,0,66,117,105,108, 116,105,110,73,109,112,111,114,116,101,114,99,1,0,0,0, @@ -1673,7 +1673,7 @@ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, 114,97,112,62,117,11,0,0,0,109,111,100,117,108,101,95, - 114,101,112,114,249,2,0,0,115,2,0,0,0,0,2,117, + 114,101,112,114,251,2,0,0,115,2,0,0,0,0,2,117, 26,0,0,0,70,114,111,122,101,110,73,109,112,111,114,116, 101,114,46,109,111,100,117,108,101,95,114,101,112,114,78,99, 3,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0, @@ -1688,7 +1688,7 @@ 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, 95,98,111,111,116,115,116,114,97,112,62,117,11,0,0,0, - 102,105,110,100,95,109,111,100,117,108,101,253,2,0,0,115, + 102,105,110,100,95,109,111,100,117,108,101,255,2,0,0,115, 2,0,0,0,0,3,117,26,0,0,0,70,114,111,122,101, 110,73,109,112,111,114,116,101,114,46,102,105,110,100,95,109, 111,100,117,108,101,99,2,0,0,0,0,0,0,0,4,0, @@ -1713,7 +1713,7 @@ 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, 98,111,111,116,115,116,114,97,112,62,117,11,0,0,0,108, - 111,97,100,95,109,111,100,117,108,101,2,3,0,0,115,18, + 111,97,100,95,109,111,100,117,108,101,4,3,0,0,115,18, 0,0,0,0,6,15,1,3,1,18,2,6,1,8,1,3, 1,22,1,13,1,117,26,0,0,0,70,114,111,122,101,110, 73,109,112,111,114,116,101,114,46,108,111,97,100,95,109,111, @@ -1730,7 +1730,7 @@ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, 46,95,98,111,111,116,115,116,114,97,112,62,117,8,0,0, - 0,103,101,116,95,99,111,100,101,19,3,0,0,115,2,0, + 0,103,101,116,95,99,111,100,101,21,3,0,0,115,2,0, 0,0,0,4,117,23,0,0,0,70,114,111,122,101,110,73, 109,112,111,114,116,101,114,46,103,101,116,95,99,111,100,101, 99,2,0,0,0,0,0,0,0,2,0,0,0,1,0,0, @@ -1744,7 +1744,7 @@ 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, 98,111,111,116,115,116,114,97,112,62,117,10,0,0,0,103, - 101,116,95,115,111,117,114,99,101,25,3,0,0,115,2,0, + 101,116,95,115,111,117,114,99,101,27,3,0,0,115,2,0, 0,0,0,4,117,25,0,0,0,70,114,111,122,101,110,73, 109,112,111,114,116,101,114,46,103,101,116,95,115,111,117,114, 99,101,99,2,0,0,0,0,0,0,0,2,0,0,0,2, @@ -1760,7 +1760,7 @@ 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, 95,98,111,111,116,115,116,114,97,112,62,117,10,0,0,0, - 105,115,95,112,97,99,107,97,103,101,31,3,0,0,115,2, + 105,115,95,112,97,99,107,97,103,101,33,3,0,0,115,2, 0,0,0,0,4,117,25,0,0,0,70,114,111,122,101,110, 73,109,112,111,114,116,101,114,46,105,115,95,112,97,99,107, 97,103,101,40,14,0,0,0,117,8,0,0,0,95,95,110, @@ -1782,7 +1782,7 @@ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, 117,14,0,0,0,70,114,111,122,101,110,73,109,112,111,114, - 116,101,114,240,2,0,0,115,28,0,0,0,16,7,6,2, + 116,101,114,242,2,0,0,115,28,0,0,0,16,7,6,2, 18,4,3,1,18,4,3,1,3,1,3,1,27,14,3,1, 21,5,3,1,21,5,3,1,117,14,0,0,0,70,114,111, 122,101,110,73,109,112,111,114,116,101,114,99,1,0,0,0, @@ -1825,7 +1825,7 @@ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, 112,62,117,14,0,0,0,95,111,112,101,110,95,114,101,103, - 105,115,116,114,121,51,3,0,0,115,8,0,0,0,0,2, + 105,115,116,114,121,53,3,0,0,115,8,0,0,0,0,2, 3,1,23,1,13,1,117,36,0,0,0,87,105,110,100,111, 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, 46,95,111,112,101,110,95,114,101,103,105,115,116,114,121,99, @@ -1860,7 +1860,7 @@ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, 16,0,0,0,95,115,101,97,114,99,104,95,114,101,103,105, - 115,116,114,121,58,3,0,0,115,22,0,0,0,0,2,9, + 115,116,114,121,60,3,0,0,115,22,0,0,0,0,2,9, 1,12,2,9,1,15,1,22,1,3,1,18,1,28,1,13, 1,9,1,117,38,0,0,0,87,105,110,100,111,119,115,82, 101,103,105,115,116,114,121,70,105,110,100,101,114,46,95,115, @@ -1893,7 +1893,7 @@ 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, 98,111,111,116,115,116,114,97,112,62,117,11,0,0,0,102, - 105,110,100,95,109,111,100,117,108,101,73,3,0,0,115,20, + 105,110,100,95,109,111,100,117,108,101,75,3,0,0,115,20, 0,0,0,0,3,15,1,12,1,4,1,3,1,17,1,13, 1,9,1,25,1,21,1,117,33,0,0,0,87,105,110,100, 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101, @@ -1915,7 +1915,7 @@ 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, 95,98,111,111,116,115,116,114,97,112,62,117,21,0,0,0, 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70, - 105,110,100,101,114,38,3,0,0,115,16,0,0,0,16,3, + 105,110,100,101,114,40,3,0,0,115,16,0,0,0,16,3, 6,3,6,3,6,2,6,2,18,7,18,15,3,1,117,21, 0,0,0,87,105,110,100,111,119,115,82,101,103,105,115,116, 114,121,70,105,110,100,101,114,99,1,0,0,0,0,0,0, @@ -1961,7 +1961,7 @@ 109,101,40,0,0,0,0,40,0,0,0,0,117,29,0,0, 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,10, - 0,0,0,105,115,95,112,97,99,107,97,103,101,93,3,0, + 0,0,0,105,115,95,112,97,99,107,97,103,101,95,3,0, 0,115,8,0,0,0,0,3,25,1,22,1,19,1,117,24, 0,0,0,95,76,111,97,100,101,114,66,97,115,105,99,115, 46,105,115,95,112,97,99,107,97,103,101,117,10,0,0,0, @@ -2012,7 +2012,7 @@ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, 114,97,112,62,117,12,0,0,0,95,108,111,97,100,95,109, - 111,100,117,108,101,101,3,0,0,115,32,0,0,0,0,4, + 111,100,117,108,101,103,3,0,0,115,32,0,0,0,0,4, 9,1,15,1,18,1,6,1,3,1,22,1,13,1,20,2, 12,1,9,1,15,1,28,2,25,1,9,1,19,1,117,26, 0,0,0,95,76,111,97,100,101,114,66,97,115,105,99,115, @@ -2029,7 +2029,7 @@ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, 112,62,117,13,0,0,0,95,76,111,97,100,101,114,66,97, - 115,105,99,115,88,3,0,0,115,8,0,0,0,16,3,6, + 115,105,99,115,90,3,0,0,115,8,0,0,0,16,3,6, 2,12,8,6,1,117,13,0,0,0,95,76,111,97,100,101, 114,66,97,115,105,99,115,99,1,0,0,0,0,0,0,0, 1,0,0,0,2,0,0,0,66,0,0,0,115,116,0,0, @@ -2059,7 +2059,7 @@ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, 97,112,62,117,10,0,0,0,112,97,116,104,95,109,116,105, - 109,101,127,3,0,0,115,2,0,0,0,0,4,117,23,0, + 109,101,129,3,0,0,115,2,0,0,0,0,4,117,23,0, 0,0,83,111,117,114,99,101,76,111,97,100,101,114,46,112, 97,116,104,95,109,116,105,109,101,99,2,0,0,0,0,0, 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,20, @@ -2095,7 +2095,7 @@ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, 114,97,112,62,117,10,0,0,0,112,97,116,104,95,115,116, - 97,116,115,133,3,0,0,115,2,0,0,0,0,10,117,23, + 97,116,115,135,3,0,0,115,2,0,0,0,0,10,117,23, 0,0,0,83,111,117,114,99,101,76,111,97,100,101,114,46, 112,97,116,104,95,115,116,97,116,115,99,4,0,0,0,0, 0,0,0,4,0,0,0,3,0,0,0,67,0,0,0,115, @@ -2123,7 +2123,7 @@ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, 115,116,114,97,112,62,117,15,0,0,0,95,99,97,99,104, - 101,95,98,121,116,101,99,111,100,101,145,3,0,0,115,2, + 101,95,98,121,116,101,99,111,100,101,147,3,0,0,115,2, 0,0,0,0,8,117,28,0,0,0,83,111,117,114,99,101, 76,111,97,100,101,114,46,95,99,97,99,104,101,95,98,121, 116,101,99,111,100,101,99,3,0,0,0,0,0,0,0,3, @@ -2146,7 +2146,7 @@ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, 116,114,97,112,62,117,8,0,0,0,115,101,116,95,100,97, - 116,97,155,3,0,0,115,2,0,0,0,0,6,117,21,0, + 116,97,157,3,0,0,115,2,0,0,0,0,6,117,21,0, 0,0,83,111,117,114,99,101,76,111,97,100,101,114,46,115, 101,116,95,100,97,116,97,99,2,0,0,0,0,0,0,0, 9,0,0,0,44,0,0,0,67,0,0,0,115,62,1,0, @@ -2205,7 +2205,7 @@ 100,101,114,40,0,0,0,0,40,0,0,0,0,117,29,0, 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 10,0,0,0,103,101,116,95,115,111,117,114,99,101,164,3, + 10,0,0,0,103,101,116,95,115,111,117,114,99,101,166,3, 0,0,115,38,0,0,0,0,2,12,1,15,1,3,1,19, 1,18,1,9,1,31,1,18,1,3,1,19,1,18,1,9, 1,31,1,18,1,3,1,30,1,18,1,9,1,117,23,0, @@ -2233,7 +2233,7 @@ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,14, 0,0,0,115,111,117,114,99,101,95,116,111,95,99,111,100, - 101,186,3,0,0,115,4,0,0,0,0,5,18,1,117,27, + 101,188,3,0,0,115,4,0,0,0,0,5,18,1,117,27, 0,0,0,83,111,117,114,99,101,76,111,97,100,101,114,46, 115,111,117,114,99,101,95,116,111,95,99,111,100,101,99,2, 0,0,0,0,0,0,0,10,0,0,0,45,0,0,0,67, @@ -2324,7 +2324,7 @@ 101,99,116,40,0,0,0,0,40,0,0,0,0,117,29,0, 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 8,0,0,0,103,101,116,95,99,111,100,101,194,3,0,0, + 8,0,0,0,103,101,116,95,99,111,100,101,196,3,0,0, 115,82,0,0,0,0,7,15,1,6,1,3,1,16,1,13, 1,11,2,3,1,19,1,13,1,5,2,16,1,3,1,19, 1,13,1,5,2,3,1,9,1,12,1,13,1,19,1,5, @@ -2357,7 +2357,7 @@ 97,109,101,40,0,0,0,0,40,0,0,0,0,117,29,0, 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 11,0,0,0,108,111,97,100,95,109,111,100,117,108,101,247, + 11,0,0,0,108,111,97,100,95,109,111,100,117,108,101,249, 3,0,0,115,2,0,0,0,0,8,117,24,0,0,0,83, 111,117,114,99,101,76,111,97,100,101,114,46,108,111,97,100, 95,109,111,100,117,108,101,78,40,11,0,0,0,117,8,0, @@ -2376,7 +2376,7 @@ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, 111,116,115,116,114,97,112,62,117,12,0,0,0,83,111,117, - 114,99,101,76,111,97,100,101,114,125,3,0,0,115,16,0, + 114,99,101,76,111,97,100,101,114,127,3,0,0,115,16,0, 0,0,16,2,12,6,12,12,12,10,12,9,12,22,12,8, 12,53,117,12,0,0,0,83,111,117,114,99,101,76,111,97, 100,101,114,99,1,0,0,0,0,0,0,0,1,0,0,0, @@ -2410,7 +2410,7 @@ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, 115,116,114,97,112,62,117,8,0,0,0,95,95,105,110,105, - 116,95,95,7,4,0,0,115,4,0,0,0,0,3,9,1, + 116,95,95,9,4,0,0,115,4,0,0,0,0,3,9,1, 117,19,0,0,0,70,105,108,101,76,111,97,100,101,114,46, 95,95,105,110,105,116,95,95,99,2,0,0,0,0,0,0, 0,2,0,0,0,3,0,0,0,3,0,0,0,115,22,0, @@ -2426,7 +2426,7 @@ 95,99,108,97,115,115,95,95,40,0,0,0,0,117,29,0, 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 11,0,0,0,108,111,97,100,95,109,111,100,117,108,101,13, + 11,0,0,0,108,111,97,100,95,109,111,100,117,108,101,15, 4,0,0,115,2,0,0,0,0,5,117,22,0,0,0,70, 105,108,101,76,111,97,100,101,114,46,108,111,97,100,95,109, 111,100,117,108,101,99,2,0,0,0,0,0,0,0,2,0, @@ -2442,7 +2442,7 @@ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, 12,0,0,0,103,101,116,95,102,105,108,101,110,97,109,101, - 20,4,0,0,115,2,0,0,0,0,3,117,23,0,0,0, + 22,4,0,0,115,2,0,0,0,0,3,117,23,0,0,0, 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,102, 105,108,101,110,97,109,101,99,2,0,0,0,0,0,0,0, 3,0,0,0,8,0,0,0,67,0,0,0,115,41,0,0, @@ -2459,7 +2459,7 @@ 105,108,101,40,0,0,0,0,40,0,0,0,0,117,29,0, 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, - 8,0,0,0,103,101,116,95,100,97,116,97,25,4,0,0, + 8,0,0,0,103,101,116,95,100,97,116,97,27,4,0,0, 115,4,0,0,0,0,2,21,1,117,19,0,0,0,70,105, 108,101,76,111,97,100,101,114,46,103,101,116,95,100,97,116, 97,40,9,0,0,0,117,8,0,0,0,95,95,110,97,109, @@ -2476,7 +2476,7 @@ 108,97,115,115,95,95,117,29,0,0,0,60,102,114,111,122, 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, 111,116,115,116,114,97,112,62,117,10,0,0,0,70,105,108, - 101,76,111,97,100,101,114,2,4,0,0,115,10,0,0,0, + 101,76,111,97,100,101,114,4,4,0,0,115,10,0,0,0, 16,3,6,2,12,6,24,7,18,5,117,10,0,0,0,70, 105,108,101,76,111,97,100,101,114,99,1,0,0,0,0,0, 0,0,1,0,0,0,4,0,0,0,66,0,0,0,115,68, @@ -2506,7 +2506,7 @@ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, 46,95,98,111,111,116,115,116,114,97,112,62,117,10,0,0, - 0,112,97,116,104,95,115,116,97,116,115,35,4,0,0,115, + 0,112,97,116,104,95,115,116,97,116,115,37,4,0,0,115, 4,0,0,0,0,2,15,1,117,27,0,0,0,83,111,117, 114,99,101,70,105,108,101,76,111,97,100,101,114,46,112,97, 116,104,95,115,116,97,116,115,99,4,0,0,0,0,0,0, @@ -2529,7 +2529,7 @@ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, 115,116,114,97,112,62,117,15,0,0,0,95,99,97,99,104, - 101,95,98,121,116,101,99,111,100,101,40,4,0,0,115,12, + 101,95,98,121,116,101,99,111,100,101,42,4,0,0,115,12, 0,0,0,0,2,3,1,22,1,13,1,11,3,10,1,117, 32,0,0,0,83,111,117,114,99,101,70,105,108,101,76,111, 97,100,101,114,46,95,99,97,99,104,101,95,98,121,116,101, @@ -2580,7 +2580,7 @@ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, 46,95,98,111,111,116,115,116,114,97,112,62,117,8,0,0, - 0,115,101,116,95,100,97,116,97,51,4,0,0,115,38,0, + 0,115,101,116,95,100,97,116,97,53,4,0,0,115,38,0, 0,0,0,2,18,1,6,2,22,1,18,1,17,2,19,1, 15,1,3,1,17,1,13,2,7,1,18,3,16,1,27,1, 3,1,16,1,17,1,18,2,117,25,0,0,0,83,111,117, @@ -2597,7 +2597,7 @@ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, 116,114,97,112,62,117,16,0,0,0,83,111,117,114,99,101, - 70,105,108,101,76,111,97,100,101,114,31,4,0,0,115,8, + 70,105,108,101,76,111,97,100,101,114,33,4,0,0,115,8, 0,0,0,16,2,6,2,12,5,12,11,117,16,0,0,0, 83,111,117,114,99,101,70,105,108,101,76,111,97,100,101,114, 99,1,0,0,0,0,0,0,0,1,0,0,0,2,0,0, @@ -2621,7 +2621,7 @@ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, 111,116,115,116,114,97,112,62,117,11,0,0,0,108,111,97, - 100,95,109,111,100,117,108,101,84,4,0,0,115,2,0,0, + 100,95,109,111,100,117,108,101,86,4,0,0,115,2,0,0, 0,0,1,117,32,0,0,0,83,111,117,114,99,101,108,101, 115,115,70,105,108,101,76,111,97,100,101,114,46,108,111,97, 100,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, @@ -2646,7 +2646,7 @@ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, 116,115,116,114,97,112,62,117,8,0,0,0,103,101,116,95, - 99,111,100,101,87,4,0,0,115,8,0,0,0,0,1,15, + 99,111,100,101,89,4,0,0,115,8,0,0,0,0,1,15, 1,15,1,24,1,117,29,0,0,0,83,111,117,114,99,101, 108,101,115,115,70,105,108,101,76,111,97,100,101,114,46,103, 101,116,95,99,111,100,101,99,2,0,0,0,0,0,0,0, @@ -2660,7 +2660,7 @@ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, 97,112,62,117,10,0,0,0,103,101,116,95,115,111,117,114, - 99,101,93,4,0,0,115,2,0,0,0,0,2,117,31,0, + 99,101,95,4,0,0,115,2,0,0,0,0,2,117,31,0, 0,0,83,111,117,114,99,101,108,101,115,115,70,105,108,101, 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99, 101,78,40,7,0,0,0,117,8,0,0,0,95,95,110,97, @@ -2675,7 +2675,7 @@ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, 46,95,98,111,111,116,115,116,114,97,112,62,117,20,0,0, 0,83,111,117,114,99,101,108,101,115,115,70,105,108,101,76, - 111,97,100,101,114,80,4,0,0,115,8,0,0,0,16,2, + 111,97,100,101,114,82,4,0,0,115,8,0,0,0,16,2, 6,2,12,3,12,6,117,20,0,0,0,83,111,117,114,99, 101,108,101,115,115,70,105,108,101,76,111,97,100,101,114,99, 1,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0, @@ -2704,7 +2704,7 @@ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, 111,111,116,115,116,114,97,112,62,117,8,0,0,0,95,95, - 105,110,105,116,95,95,110,4,0,0,115,4,0,0,0,0, + 105,110,105,116,95,95,112,4,0,0,115,4,0,0,0,0, 1,9,1,117,28,0,0,0,69,120,116,101,110,115,105,111, 110,70,105,108,101,76,111,97,100,101,114,46,95,95,105,110, 105,116,95,95,99,2,0,0,0,0,0,0,0,4,0,0, @@ -2743,7 +2743,7 @@ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, 117,11,0,0,0,108,111,97,100,95,109,111,100,117,108,101, - 114,4,0,0,115,24,0,0,0,0,5,15,1,3,1,9, + 116,4,0,0,115,24,0,0,0,0,5,15,1,3,1,9, 1,15,1,16,1,31,1,28,1,8,1,3,1,22,1,13, 1,117,31,0,0,0,69,120,116,101,110,115,105,111,110,70, 105,108,101,76,111,97,100,101,114,46,108,111,97,100,95,109, @@ -2766,7 +2766,7 @@ 0,102,105,108,101,95,110,97,109,101,40,0,0,0,0,117, 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, - 62,117,9,0,0,0,60,103,101,110,101,120,112,114,62,135, + 62,117,9,0,0,0,60,103,101,110,101,120,112,114,62,137, 4,0,0,115,2,0,0,0,6,1,117,49,0,0,0,69, 120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100, 101,114,46,105,115,95,112,97,99,107,97,103,101,46,60,108, @@ -2781,7 +2781,7 @@ 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, 112,62,117,10,0,0,0,105,115,95,112,97,99,107,97,103, - 101,132,4,0,0,115,6,0,0,0,0,2,19,1,18,1, + 101,134,4,0,0,115,6,0,0,0,0,2,19,1,18,1, 117,30,0,0,0,69,120,116,101,110,115,105,111,110,70,105, 108,101,76,111,97,100,101,114,46,105,115,95,112,97,99,107, 97,103,101,99,2,0,0,0,0,0,0,0,2,0,0,0, @@ -2796,7 +2796,7 @@ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, 116,115,116,114,97,112,62,117,8,0,0,0,103,101,116,95, - 99,111,100,101,138,4,0,0,115,2,0,0,0,0,2,117, + 99,111,100,101,140,4,0,0,115,2,0,0,0,0,2,117, 28,0,0,0,69,120,116,101,110,115,105,111,110,70,105,108, 101,76,111,97,100,101,114,46,103,101,116,95,99,111,100,101, 99,2,0,0,0,0,0,0,0,2,0,0,0,1,0,0, @@ -2810,7 +2810,7 @@ 0,0,0,40,0,0,0,0,117,29,0,0,0,60,102,114, 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, 98,111,111,116,115,116,114,97,112,62,117,10,0,0,0,103, - 101,116,95,115,111,117,114,99,101,142,4,0,0,115,2,0, + 101,116,95,115,111,117,114,99,101,144,4,0,0,115,2,0, 0,0,0,2,117,30,0,0,0,69,120,116,101,110,115,105, 111,110,70,105,108,101,76,111,97,100,101,114,46,103,101,116, 95,115,111,117,114,99,101,78,40,12,0,0,0,117,8,0, @@ -2830,7 +2830,7 @@ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, 98,46,95,98,111,111,116,115,116,114,97,112,62,117,19,0, 0,0,69,120,116,101,110,115,105,111,110,70,105,108,101,76, - 111,97,100,101,114,102,4,0,0,115,16,0,0,0,16,6, + 111,97,100,101,114,104,4,0,0,115,16,0,0,0,16,6, 6,2,12,4,3,1,3,1,24,16,12,6,12,4,117,19, 0,0,0,69,120,116,101,110,115,105,111,110,70,105,108,101, 76,111,97,100,101,114,99,1,0,0,0,0,0,0,0,1, @@ -2881,7 +2881,7 @@ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, 111,116,115,116,114,97,112,62,117,8,0,0,0,95,95,105, - 110,105,116,95,95,154,4,0,0,115,8,0,0,0,0,1, + 110,105,116,95,95,156,4,0,0,115,8,0,0,0,0,1, 9,1,9,1,21,1,117,23,0,0,0,95,78,97,109,101, 115,112,97,99,101,80,97,116,104,46,95,95,105,110,105,116, 95,95,99,1,0,0,0,0,0,0,0,4,0,0,0,3, @@ -2906,7 +2906,7 @@ 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, 98,111,111,116,115,116,114,97,112,62,117,23,0,0,0,95, 102,105,110,100,95,112,97,114,101,110,116,95,112,97,116,104, - 95,110,97,109,101,115,160,4,0,0,115,8,0,0,0,0, + 95,110,97,109,101,115,162,4,0,0,115,8,0,0,0,0, 2,27,1,12,2,4,3,117,38,0,0,0,95,78,97,109, 101,115,112,97,99,101,80,97,116,104,46,95,102,105,110,100, 95,112,97,114,101,110,116,95,112,97,116,104,95,110,97,109, @@ -2926,7 +2926,7 @@ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, 98,46,95,98,111,111,116,115,116,114,97,112,62,117,16,0, 0,0,95,103,101,116,95,112,97,114,101,110,116,95,112,97, - 116,104,170,4,0,0,115,4,0,0,0,0,1,18,1,117, + 116,104,172,4,0,0,115,4,0,0,0,0,1,18,1,117, 31,0,0,0,95,78,97,109,101,115,112,97,99,101,80,97, 116,104,46,95,103,101,116,95,112,97,114,101,110,116,95,112, 97,116,104,99,1,0,0,0,0,0,0,0,4,0,0,0, @@ -2950,7 +2950,7 @@ 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, 95,98,111,111,116,115,116,114,97,112,62,117,12,0,0,0, - 95,114,101,99,97,108,99,117,108,97,116,101,174,4,0,0, + 95,114,101,99,97,108,99,117,108,97,116,101,176,4,0,0, 115,14,0,0,0,0,2,18,1,15,1,27,3,12,1,12, 1,12,1,117,27,0,0,0,95,78,97,109,101,115,112,97, 99,101,80,97,116,104,46,95,114,101,99,97,108,99,117,108, @@ -2963,7 +2963,7 @@ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, 46,95,98,111,111,116,115,116,114,97,112,62,117,8,0,0, - 0,95,95,105,116,101,114,95,95,186,4,0,0,115,2,0, + 0,95,95,105,116,101,114,95,95,188,4,0,0,115,2,0, 0,0,0,1,117,23,0,0,0,95,78,97,109,101,115,112, 97,99,101,80,97,116,104,46,95,95,105,116,101,114,95,95, 99,1,0,0,0,0,0,0,0,1,0,0,0,2,0,0, @@ -2975,7 +2975,7 @@ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, 111,116,115,116,114,97,112,62,117,7,0,0,0,95,95,108, - 101,110,95,95,189,4,0,0,115,2,0,0,0,0,1,117, + 101,110,95,95,191,4,0,0,115,2,0,0,0,0,1,117, 22,0,0,0,95,78,97,109,101,115,112,97,99,101,80,97, 116,104,46,95,95,108,101,110,95,95,99,1,0,0,0,0, 0,0,0,1,0,0,0,2,0,0,0,67,0,0,0,115, @@ -2988,7 +2988,7 @@ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, 116,115,116,114,97,112,62,117,8,0,0,0,95,95,114,101, - 112,114,95,95,192,4,0,0,115,2,0,0,0,0,1,117, + 112,114,95,95,194,4,0,0,115,2,0,0,0,0,1,117, 23,0,0,0,95,78,97,109,101,115,112,97,99,101,80,97, 116,104,46,95,95,114,101,112,114,95,95,99,2,0,0,0, 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, @@ -3000,7 +3000,7 @@ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, 114,97,112,62,117,12,0,0,0,95,95,99,111,110,116,97, - 105,110,115,95,95,195,4,0,0,115,2,0,0,0,0,1, + 105,110,115,95,95,197,4,0,0,115,2,0,0,0,0,1, 117,27,0,0,0,95,78,97,109,101,115,112,97,99,101,80, 97,116,104,46,95,95,99,111,110,116,97,105,110,115,95,95, 99,2,0,0,0,0,0,0,0,2,0,0,0,2,0,0, @@ -3012,7 +3012,7 @@ 0,105,116,101,109,40,0,0,0,0,40,0,0,0,0,117, 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, - 62,117,6,0,0,0,97,112,112,101,110,100,198,4,0,0, + 62,117,6,0,0,0,97,112,112,101,110,100,200,4,0,0, 115,2,0,0,0,0,1,117,21,0,0,0,95,78,97,109, 101,115,112,97,99,101,80,97,116,104,46,97,112,112,101,110, 100,78,40,13,0,0,0,117,8,0,0,0,95,95,110,97, @@ -3033,7 +3033,7 @@ 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, 62,117,14,0,0,0,95,78,97,109,101,115,112,97,99,101, - 80,97,116,104,147,4,0,0,115,20,0,0,0,16,5,6, + 80,97,116,104,149,4,0,0,115,20,0,0,0,16,5,6, 2,12,6,12,10,12,4,12,12,12,3,12,3,12,3,12, 3,117,14,0,0,0,95,78,97,109,101,115,112,97,99,101, 80,97,116,104,99,1,0,0,0,0,0,0,0,1,0,0, @@ -3055,7 +3055,7 @@ 102,105,110,100,101,114,40,0,0,0,0,40,0,0,0,0, 117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, 111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, - 112,62,117,8,0,0,0,95,95,105,110,105,116,95,95,203, + 112,62,117,8,0,0,0,95,95,105,110,105,116,95,95,205, 4,0,0,115,2,0,0,0,0,1,117,24,0,0,0,78, 97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,95, 95,105,110,105,116,95,95,99,2,0,0,0,0,0,0,0, @@ -3070,7 +3070,7 @@ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, 115,116,114,97,112,62,117,11,0,0,0,109,111,100,117,108, - 101,95,114,101,112,114,206,4,0,0,115,2,0,0,0,0, + 101,95,114,101,112,114,208,4,0,0,115,2,0,0,0,0, 2,117,27,0,0,0,78,97,109,101,115,112,97,99,101,76, 111,97,100,101,114,46,109,111,100,117,108,101,95,114,101,112, 114,99,2,0,0,0,0,0,0,0,2,0,0,0,3,0, @@ -3089,7 +3089,7 @@ 108,101,40,0,0,0,0,40,0,0,0,0,117,29,0,0, 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,11, - 0,0,0,108,111,97,100,95,109,111,100,117,108,101,210,4, + 0,0,0,108,111,97,100,95,109,111,100,117,108,101,212,4, 0,0,115,6,0,0,0,0,3,16,1,12,1,117,27,0, 0,0,78,97,109,101,115,112,97,99,101,76,111,97,100,101, 114,46,108,111,97,100,95,109,111,100,117,108,101,78,40,8, @@ -3106,7 +3106,7 @@ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, 97,112,62,117,15,0,0,0,78,97,109,101,115,112,97,99, - 101,76,111,97,100,101,114,202,4,0,0,115,6,0,0,0, + 101,76,111,97,100,101,114,204,4,0,0,115,6,0,0,0, 16,1,12,3,18,4,117,15,0,0,0,78,97,109,101,115, 112,97,99,101,76,111,97,100,101,114,99,1,0,0,0,0, 0,0,0,1,0,0,0,4,0,0,0,66,0,0,0,115, @@ -3149,7 +3149,7 @@ 111,122,101,110,32,105,109,112,111,114,116,108,105,98,46,95, 98,111,111,116,115,116,114,97,112,62,117,17,0,0,0,105, 110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,115, - 224,4,0,0,115,6,0,0,0,0,4,22,1,15,1,117, + 226,4,0,0,115,6,0,0,0,0,4,22,1,15,1,117, 28,0,0,0,80,97,116,104,70,105,110,100,101,114,46,105, 110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,115, 99,2,0,0,0,0,0,0,0,3,0,0,0,12,0,0, @@ -3180,7 +3180,7 @@ 0,0,0,60,102,114,111,122,101,110,32,105,109,112,111,114, 116,108,105,98,46,95,98,111,111,116,115,116,114,97,112,62, 117,11,0,0,0,95,112,97,116,104,95,104,111,111,107,115, - 232,4,0,0,115,16,0,0,0,0,7,9,1,19,1,16, + 234,4,0,0,115,16,0,0,0,0,7,9,1,19,1,16, 1,3,1,14,1,13,1,12,2,117,22,0,0,0,80,97, 116,104,70,105,110,100,101,114,46,95,112,97,116,104,95,104, 111,111,107,115,99,2,0,0,0,0,0,0,0,3,0,0, @@ -3215,7 +3215,7 @@ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, 20,0,0,0,95,112,97,116,104,95,105,109,112,111,114,116, - 101,114,95,99,97,99,104,101,249,4,0,0,115,16,0,0, + 101,114,95,99,97,99,104,101,251,4,0,0,115,16,0,0, 0,0,8,12,1,9,1,3,1,17,1,13,1,15,1,18, 1,117,31,0,0,0,80,97,116,104,70,105,110,100,101,114, 46,95,112,97,116,104,95,105,109,112,111,114,116,101,114,95, @@ -3255,7 +3255,7 @@ 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, 95,98,111,111,116,115,116,114,97,112,62,117,11,0,0,0, - 95,103,101,116,95,108,111,97,100,101,114,10,5,0,0,115, + 95,103,101,116,95,108,111,97,100,101,114,12,5,0,0,115, 28,0,0,0,0,5,6,1,13,1,21,1,6,1,15,1, 12,1,15,1,24,2,15,1,6,1,12,2,10,5,20,2, 117,22,0,0,0,80,97,116,104,70,105,110,100,101,114,46, @@ -3285,7 +3285,7 @@ 0,0,0,0,40,0,0,0,0,117,29,0,0,0,60,102, 114,111,122,101,110,32,105,109,112,111,114,116,108,105,98,46, 95,98,111,111,116,115,116,114,97,112,62,117,11,0,0,0, - 102,105,110,100,95,109,111,100,117,108,101,37,5,0,0,115, + 102,105,110,100,95,109,111,100,117,108,101,39,5,0,0,115, 16,0,0,0,0,4,12,1,12,1,24,1,12,1,4,2, 6,3,19,2,117,22,0,0,0,80,97,116,104,70,105,110, 100,101,114,46,102,105,110,100,95,109,111,100,117,108,101,40, @@ -3304,7 +3304,7 @@ 40,0,0,0,0,40,0,0,0,0,117,29,0,0,0,60, 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, 46,95,98,111,111,116,115,116,114,97,112,62,117,10,0,0, - 0,80,97,116,104,70,105,110,100,101,114,220,4,0,0,115, + 0,80,97,116,104,70,105,110,100,101,114,222,4,0,0,115, 14,0,0,0,16,2,6,2,18,8,18,17,18,17,18,27, 3,1,117,10,0,0,0,80,97,116,104,70,105,110,100,101, 114,99,1,0,0,0,0,0,0,0,1,0,0,0,3,0, @@ -3360,7 +3360,7 @@ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, 97,112,62,117,9,0,0,0,60,103,101,110,101,120,112,114, - 62,70,5,0,0,115,2,0,0,0,6,0,117,38,0,0, + 62,72,5,0,0,115,2,0,0,0,6,0,117,38,0,0, 0,70,105,108,101,70,105,110,100,101,114,46,95,95,105,110, 105,116,95,95,46,60,108,111,99,97,108,115,62,46,60,103, 101,110,101,120,112,114,62,117,1,0,0,0,46,105,1,0, @@ -3378,7 +3378,7 @@ 1,0,0,0,117,6,0,0,0,108,111,97,100,101,114,117, 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, - 62,117,8,0,0,0,95,95,105,110,105,116,95,95,64,5, + 62,117,8,0,0,0,95,95,105,110,105,116,95,95,66,5, 0,0,115,16,0,0,0,0,4,6,1,19,1,36,1,9, 2,15,1,9,1,12,1,117,19,0,0,0,70,105,108,101, 70,105,110,100,101,114,46,95,95,105,110,105,116,95,95,99, @@ -3393,7 +3393,7 @@ 0,0,40,0,0,0,0,117,29,0,0,0,60,102,114,111, 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, 111,111,116,115,116,114,97,112,62,117,17,0,0,0,105,110, - 118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,78, + 118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,80, 5,0,0,115,2,0,0,0,0,2,117,28,0,0,0,70, 105,108,101,70,105,110,100,101,114,46,105,110,118,97,108,105, 100,97,116,101,95,99,97,99,104,101,115,99,2,0,0,0, @@ -3464,7 +3464,7 @@ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, 114,97,112,62,117,11,0,0,0,102,105,110,100,95,108,111, - 97,100,101,114,84,5,0,0,115,62,0,0,0,0,3,6, + 97,100,101,114,86,5,0,0,115,62,0,0,0,0,3,6, 1,19,1,3,1,25,1,13,1,11,1,15,1,10,1,12, 2,9,1,9,1,15,2,9,1,6,2,12,1,18,1,12, 1,22,1,10,1,15,1,12,1,26,4,12,2,22,1,16, @@ -3504,7 +3504,7 @@ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, 116,115,116,114,97,112,62,117,9,0,0,0,60,103,101,110, - 101,120,112,114,62,155,5,0,0,115,2,0,0,0,6,0, + 101,120,112,114,62,157,5,0,0,115,2,0,0,0,6,0, 117,41,0,0,0,70,105,108,101,70,105,110,100,101,114,46, 95,102,105,108,108,95,99,97,99,104,101,46,60,108,111,99, 97,108,115,62,46,60,103,101,110,101,120,112,114,62,78,40, @@ -3534,7 +3534,7 @@ 101,40,0,0,0,0,40,0,0,0,0,117,29,0,0,0, 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, 98,46,95,98,111,111,116,115,116,114,97,112,62,117,11,0, - 0,0,95,102,105,108,108,95,99,97,99,104,101,126,5,0, + 0,0,95,102,105,108,108,95,99,97,99,104,101,128,5,0, 0,115,34,0,0,0,0,2,9,1,3,1,19,1,22,3, 11,3,18,1,18,7,9,1,13,1,24,1,6,1,27,2, 6,1,17,1,9,1,18,1,117,22,0,0,0,70,105,108, @@ -3580,7 +3580,7 @@ 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, 111,111,116,115,116,114,97,112,62,117,24,0,0,0,112,97, 116,104,95,104,111,111,107,95,102,111,114,95,70,105,108,101, - 70,105,110,100,101,114,167,5,0,0,115,6,0,0,0,0, + 70,105,110,100,101,114,169,5,0,0,115,6,0,0,0,0, 2,12,1,21,1,117,54,0,0,0,70,105,108,101,70,105, 110,100,101,114,46,112,97,116,104,95,104,111,111,107,46,60, 108,111,99,97,108,115,62,46,112,97,116,104,95,104,111,111, @@ -3594,7 +3594,7 @@ 100,101,116,97,105,108,115,117,29,0,0,0,60,102,114,111, 122,101,110,32,105,109,112,111,114,116,108,105,98,46,95,98, 111,111,116,115,116,114,97,112,62,117,9,0,0,0,112,97, - 116,104,95,104,111,111,107,157,5,0,0,115,4,0,0,0, + 116,104,95,104,111,111,107,159,5,0,0,115,4,0,0,0, 0,10,21,6,117,20,0,0,0,70,105,108,101,70,105,110, 100,101,114,46,112,97,116,104,95,104,111,111,107,99,1,0, 0,0,0,0,0,0,1,0,0,0,2,0,0,0,67,0, @@ -3607,7 +3607,7 @@ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, 116,114,97,112,62,117,8,0,0,0,95,95,114,101,112,114, - 95,95,175,5,0,0,115,2,0,0,0,0,1,117,19,0, + 95,95,177,5,0,0,115,2,0,0,0,0,1,117,19,0, 0,0,70,105,108,101,70,105,110,100,101,114,46,95,95,114, 101,112,114,95,95,78,40,13,0,0,0,117,8,0,0,0, 95,95,110,97,109,101,95,95,117,10,0,0,0,95,95,109, @@ -3627,7 +3627,7 @@ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, 111,116,115,116,114,97,112,62,117,10,0,0,0,70,105,108, - 101,70,105,110,100,101,114,55,5,0,0,115,16,0,0,0, + 101,70,105,110,100,101,114,57,5,0,0,115,16,0,0,0, 16,7,6,2,12,14,12,4,6,2,12,42,12,31,18,18, 117,10,0,0,0,70,105,108,101,70,105,110,100,101,114,99, 1,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0, @@ -3650,7 +3650,7 @@ 0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,105, 109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,116, 114,97,112,62,117,9,0,0,0,95,95,101,110,116,101,114, - 95,95,185,5,0,0,115,2,0,0,0,0,2,117,28,0, + 95,95,187,5,0,0,115,2,0,0,0,0,2,117,28,0, 0,0,95,73,109,112,111,114,116,76,111,99,107,67,111,110, 116,101,120,116,46,95,95,101,110,116,101,114,95,95,99,4, 0,0,0,0,0,0,0,4,0,0,0,1,0,0,0,67, @@ -3669,7 +3669,7 @@ 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, 97,112,62,117,8,0,0,0,95,95,101,120,105,116,95,95, - 189,5,0,0,115,2,0,0,0,0,2,117,27,0,0,0, + 191,5,0,0,115,2,0,0,0,0,2,117,27,0,0,0, 95,73,109,112,111,114,116,76,111,99,107,67,111,110,116,101, 120,116,46,95,95,101,120,105,116,95,95,78,40,6,0,0, 0,117,8,0,0,0,95,95,110,97,109,101,95,95,117,10, @@ -3682,7 +3682,7 @@ 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, 116,114,97,112,62,117,18,0,0,0,95,73,109,112,111,114, - 116,76,111,99,107,67,111,110,116,101,120,116,181,5,0,0, + 116,76,111,99,107,67,111,110,116,101,120,116,183,5,0,0, 115,6,0,0,0,16,2,6,2,12,4,117,18,0,0,0, 95,73,109,112,111,114,116,76,111,99,107,67,111,110,116,101, 120,116,99,3,0,0,0,0,0,0,0,5,0,0,0,4, @@ -3711,7 +3711,7 @@ 0,40,0,0,0,0,117,29,0,0,0,60,102,114,111,122, 101,110,32,105,109,112,111,114,116,108,105,98,46,95,98,111, 111,116,115,116,114,97,112,62,117,13,0,0,0,95,114,101, - 115,111,108,118,101,95,110,97,109,101,194,5,0,0,115,10, + 115,111,108,118,101,95,110,97,109,101,196,5,0,0,115,10, 0,0,0,0,2,22,1,18,1,15,1,10,1,117,13,0, 0,0,95,114,101,115,111,108,118,101,95,110,97,109,101,99, 2,0,0,0,0,0,0,0,4,0,0,0,11,0,0,0, @@ -3743,7 +3743,7 @@ 0,0,60,102,114,111,122,101,110,32,105,109,112,111,114,116, 108,105,98,46,95,98,111,111,116,115,116,114,97,112,62,117, 12,0,0,0,95,102,105,110,100,95,109,111,100,117,108,101, - 203,5,0,0,115,20,0,0,0,0,2,9,1,19,1,16, + 205,5,0,0,115,20,0,0,0,0,2,9,1,19,1,16, 1,10,1,24,1,12,2,15,1,4,2,21,2,117,12,0, 0,0,95,102,105,110,100,95,109,111,100,117,108,101,99,3, 0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,67, @@ -3787,7 +3787,7 @@ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, 115,116,114,97,112,62,117,13,0,0,0,95,115,97,110,105, - 116,121,95,99,104,101,99,107,220,5,0,0,115,24,0,0, + 116,121,95,99,104,101,99,107,222,5,0,0,115,24,0,0, 0,0,2,15,1,30,1,12,1,15,1,6,1,15,1,15, 1,15,1,6,2,27,1,19,1,117,13,0,0,0,95,115, 97,110,105,116,121,95,99,104,101,99,107,117,20,0,0,0, @@ -3863,7 +3863,7 @@ 102,114,111,122,101,110,32,105,109,112,111,114,116,108,105,98, 46,95,98,111,111,116,115,116,114,97,112,62,117,23,0,0, 0,95,102,105,110,100,95,97,110,100,95,108,111,97,100,95, - 117,110,108,111,99,107,101,100,239,5,0,0,115,76,0,0, + 117,110,108,111,99,107,101,100,241,5,0,0,115,76,0,0, 0,0,1,6,1,19,1,6,1,15,1,16,2,15,1,11, 2,13,1,3,1,13,1,13,1,22,1,26,1,15,1,12, 1,27,3,9,1,9,1,15,2,13,1,19,2,13,1,6, @@ -3893,7 +3893,7 @@ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, 115,116,114,97,112,62,117,14,0,0,0,95,102,105,110,100, - 95,97,110,100,95,108,111,97,100,33,6,0,0,115,14,0, + 95,97,110,100,95,108,111,97,100,35,6,0,0,115,14,0, 0,0,0,2,3,1,16,2,11,1,10,1,3,1,17,2, 117,14,0,0,0,95,102,105,110,100,95,97,110,100,95,108, 111,97,100,99,3,0,0,0,0,0,0,0,5,0,0,0, @@ -3951,7 +3951,7 @@ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, 115,116,114,97,112,62,117,11,0,0,0,95,103,99,100,95, - 105,109,112,111,114,116,46,6,0,0,115,28,0,0,0,0, + 105,109,112,111,114,116,48,6,0,0,115,28,0,0,0,0, 9,16,1,12,1,21,1,10,1,15,1,13,1,13,1,12, 1,10,1,6,1,9,1,21,1,10,1,117,11,0,0,0, 95,103,99,100,95,105,109,112,111,114,116,99,3,0,0,0, @@ -4009,7 +4009,7 @@ 60,102,114,111,122,101,110,32,105,109,112,111,114,116,108,105, 98,46,95,98,111,111,116,115,116,114,97,112,62,117,16,0, 0,0,95,104,97,110,100,108,101,95,102,114,111,109,108,105, - 115,116,70,6,0,0,115,34,0,0,0,0,10,15,1,12, + 115,116,72,6,0,0,115,34,0,0,0,0,10,15,1,12, 1,12,1,13,1,15,1,22,1,13,1,15,1,21,1,3, 1,17,1,18,6,18,1,15,1,9,1,32,1,117,16,0, 0,0,95,104,97,110,100,108,101,95,102,114,111,109,108,105, @@ -4041,7 +4041,7 @@ 0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,110, 32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,116, 115,116,114,97,112,62,117,17,0,0,0,95,99,97,108,99, - 95,95,95,112,97,99,107,97,103,101,95,95,104,6,0,0, + 95,95,95,112,97,99,107,97,103,101,95,95,106,6,0,0, 115,12,0,0,0,0,7,15,1,12,1,10,1,12,1,25, 1,117,17,0,0,0,95,99,97,108,99,95,95,95,112,97, 99,107,97,103,101,95,95,99,0,0,0,0,0,0,0,0, @@ -4073,7 +4073,7 @@ 0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, 105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,27, 0,0,0,95,103,101,116,95,115,117,112,112,111,114,116,101, - 100,95,102,105,108,101,95,108,111,97,100,101,114,115,119,6, + 100,95,102,105,108,101,95,108,111,97,100,101,114,115,121,6, 0,0,115,8,0,0,0,0,5,18,1,12,1,12,1,117, 27,0,0,0,95,103,101,116,95,115,117,112,112,111,114,116, 101,100,95,102,105,108,101,95,108,111,97,100,101,114,115,99, @@ -4141,7 +4141,7 @@ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, 116,115,116,114,97,112,62,117,10,0,0,0,95,95,105,109, - 112,111,114,116,95,95,130,6,0,0,115,26,0,0,0,0, + 112,111,114,116,95,95,132,6,0,0,115,26,0,0,0,0, 11,12,1,15,2,24,1,12,1,18,1,6,3,12,1,23, 1,6,1,4,4,35,3,40,2,117,10,0,0,0,95,95, 105,109,112,111,114,116,95,95,99,2,0,0,0,0,0,0, @@ -4218,7 +4218,7 @@ 0,0,115,101,112,40,0,0,0,0,40,0,0,0,0,117, 29,0,0,0,60,102,114,111,122,101,110,32,105,109,112,111, 114,116,108,105,98,46,95,98,111,111,116,115,116,114,97,112, - 62,117,9,0,0,0,60,103,101,110,101,120,112,114,62,198, + 62,117,9,0,0,0,60,103,101,110,101,120,112,114,62,200, 6,0,0,115,2,0,0,0,6,0,117,25,0,0,0,95, 115,101,116,117,112,46,60,108,111,99,97,108,115,62,46,60, 103,101,110,101,120,112,114,62,105,0,0,0,0,117,30,0, @@ -4279,7 +4279,7 @@ 95,109,111,100,117,108,101,40,0,0,0,0,40,0,0,0, 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109, 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114, - 97,112,62,117,6,0,0,0,95,115,101,116,117,112,166,6, + 97,112,62,117,6,0,0,0,95,115,101,116,117,112,168,6, 0,0,115,92,0,0,0,0,9,6,1,6,2,12,1,9, 2,6,2,19,1,15,1,16,2,13,1,13,1,15,1,18, 2,13,1,20,2,33,1,19,2,31,1,10,1,15,1,13, @@ -4323,7 +4323,7 @@ 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101, 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111, 116,115,116,114,97,112,62,117,8,0,0,0,95,105,110,115, - 116,97,108,108,237,6,0,0,115,16,0,0,0,0,2,13, + 116,97,108,108,239,6,0,0,115,16,0,0,0,0,2,13, 1,9,1,28,1,16,1,16,1,15,1,19,1,117,8,0, 0,0,95,105,110,115,116,97,108,108,40,3,0,0,0,117, 3,0,0,0,119,105,110,117,6,0,0,0,99,121,103,119, @@ -4422,7 +4422,7 @@ 111,116,115,116,114,97,112,62,117,8,0,0,0,60,109,111, 100,117,108,101,62,8,0,0,0,115,136,0,0,0,6,21, 6,3,12,13,12,16,12,13,12,12,12,12,12,10,12,6, - 12,7,15,22,12,8,15,3,12,12,6,2,6,3,22,4, + 12,7,15,24,12,8,15,3,12,12,6,2,6,3,22,4, 19,68,19,23,12,19,12,20,12,100,34,1,37,2,6,2, 9,2,9,1,9,2,15,27,12,23,12,21,12,8,12,13, 12,11,12,55,12,18,12,11,12,11,12,13,21,54,21,15, diff -r d8c2ce63f5a4 -r 297b3529876a Python/pyarena.c --- a/Python/pyarena.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Python/pyarena.c Fri Jan 25 22:52:26 2013 +0100 @@ -156,6 +156,7 @@ void PyArena_Free(PyArena *arena) { + int r; assert(arena); #if defined(Py_DEBUG) /* @@ -172,6 +173,12 @@ assert(arena->a_objects->ob_refcnt == 1); */ + /* Clear all the elements from the list. This is necessary + to guarantee that they will be DECREFed. */ + r = PyList_SetSlice(arena->a_objects, + 0, PyList_GET_SIZE(arena->a_objects), NULL); + assert(r == 0); + assert(PyList_GET_SIZE(arena->a_objects) == 0); Py_DECREF(arena->a_objects); free(arena); } diff -r d8c2ce63f5a4 -r 297b3529876a Python/pythonrun.c --- a/Python/pythonrun.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Python/pythonrun.c Fri Jan 25 22:52:26 2013 +0100 @@ -29,6 +29,10 @@ #include #endif +#ifdef HAVE_FCNTL_H +#include +#endif /* HAVE_FCNTL_H */ + #ifdef MS_WINDOWS #undef BYTE #include "windows.h" @@ -275,6 +279,8 @@ check its value further. */ if ((p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0') Py_HashRandomizationFlag = add_flag(Py_HashRandomizationFlag, p); + if ((p = Py_GETENV("PYTHONCLOEXEC")) && *p != '\0') + Py_DefaultCloexec = 1; _PyRandom_Init(); @@ -1418,11 +1424,17 @@ len = strlen(filename); ext = filename + len - (len > 4 ? 4 : 0); if (maybe_pyc_file(fp, filename, ext, closeit)) { + int fd; FILE *pyc_fp; /* Try to run a pyc file. First, re-open in binary */ if (closeit) fclose(fp); - if ((pyc_fp = fopen(filename, "rb")) == NULL) { + fd = _Py_open(filename, O_RDONLY); + if (fd != -1) + pyc_fp = fdopen(fd, "rb"); + else + pyc_fp = NULL; + if (pyc_fp == NULL) { fprintf(stderr, "python: Can't reopen .pyc file\n"); goto done; } diff -r d8c2ce63f5a4 -r 297b3529876a Python/random.c --- a/Python/random.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Python/random.c Fri Jan 25 22:52:26 2013 +0100 @@ -12,6 +12,13 @@ #endif #ifdef MS_WINDOWS +typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ + LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\ + DWORD dwFlags ); +typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\ + BYTE *pbBuffer ); + +static CRYPTGENRANDOM pCryptGenRandom = NULL; /* This handle is never explicitly released. Instead, the operating system will release it when the process terminates. */ static HCRYPTPROV hCryptProv = 0; @@ -19,9 +26,29 @@ static int win32_urandom_init(int raise) { + HINSTANCE hAdvAPI32 = NULL; + CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL; + + /* Obtain handle to the DLL containing CryptoAPI. This should not fail. */ + hAdvAPI32 = GetModuleHandle("advapi32.dll"); + if(hAdvAPI32 == NULL) + goto error; + + /* Obtain pointers to the CryptoAPI functions. This will fail on some early + versions of Win95. */ + pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress( + hAdvAPI32, "CryptAcquireContextA"); + if (pCryptAcquireContext == NULL) + goto error; + + pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress(hAdvAPI32, + "CryptGenRandom"); + if (pCryptGenRandom == NULL) + goto error; + /* Acquire context */ - if (!CryptAcquireContext(&hCryptProv, NULL, NULL, - PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) + if (! pCryptAcquireContext(&hCryptProv, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) goto error; return 0; @@ -50,7 +77,7 @@ while (size > 0) { chunk = size > INT_MAX ? INT_MAX : size; - if (!CryptGenRandom(hCryptProv, chunk, buffer)) + if (!pCryptGenRandom(hCryptProv, chunk, buffer)) { /* CryptGenRandom() failed */ if (raise) @@ -101,7 +128,7 @@ assert (0 < size); - fd = open("/dev/urandom", O_RDONLY); + fd = _Py_open("/dev/urandom", O_RDONLY); if (fd < 0) Py_FatalError("Failed to open /dev/urandom"); @@ -133,11 +160,8 @@ if (size <= 0) return 0; - Py_BEGIN_ALLOW_THREADS - fd = open("/dev/urandom", O_RDONLY); - Py_END_ALLOW_THREADS - if (fd < 0) - { + fd = _Py_open("/dev/urandom", O_RDONLY); + if (fd < 0) { PyErr_SetString(PyExc_NotImplementedError, "/dev/urandom (or equivalent) not found"); return -1; diff -r d8c2ce63f5a4 -r 297b3529876a Python/sysmodule.c --- a/Python/sysmodule.c Fri Jan 25 23:53:29 2013 +0200 +++ b/Python/sysmodule.c Fri Jan 25 22:52:26 2013 +0100 @@ -1057,6 +1057,30 @@ Clear the internal type lookup cache."); +static PyObject * +sys_getdefaultcloexec(PyObject* self) +{ + return PyBool_FromLong(Py_DefaultCloexec); +} + +PyDoc_STRVAR(getdefaultcloexec_doc, +"getdefaultcloexec() -> bool\n\ +\n\ +Return the current default value of 'cloexec' (close-on-exec) parameter."); + +static PyObject * +sys_setdefaultcloexec(PyObject* self) +{ + Py_DefaultCloexec = 1; + Py_RETURN_NONE; +} + +PyDoc_STRVAR(setdefaultcloexec_doc, +"setdefaultcloexec()\n\ +\n\ +Set the default value of the 'cloexec' (close-on-exec) parameter to True."); + + static PyMethodDef sys_methods[] = { /* Might as well keep this in alphabetic order */ {"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS, @@ -1131,6 +1155,10 @@ {"call_tracing", sys_call_tracing, METH_VARARGS, call_tracing_doc}, {"_debugmallocstats", sys_debugmallocstats, METH_VARARGS, debugmallocstats_doc}, + {"getdefaultcloexec", (PyCFunction)sys_getdefaultcloexec, + METH_NOARGS, getdefaultcloexec_doc}, + {"setdefaultcloexec", (PyCFunction)sys_setdefaultcloexec, + METH_NOARGS, setdefaultcloexec_doc}, {NULL, NULL} /* sentinel */ }; diff -r d8c2ce63f5a4 -r 297b3529876a Python/thread_nt.h --- a/Python/thread_nt.h Fri Jan 25 23:53:29 2013 +0200 +++ b/Python/thread_nt.h Fri Jan 25 22:52:26 2013 +0100 @@ -130,7 +130,7 @@ DWORD EnterNonRecursiveMutex(PNRMUTEX mutex, DWORD milliseconds) { - return WaitForSingleObjectEx(mutex, milliseconds, FALSE); + return WaitForSingleObject(mutex, milliseconds); } BOOL diff -r d8c2ce63f5a4 -r 297b3529876a Tools/buildbot/external-amd64.bat --- a/Tools/buildbot/external-amd64.bat Fri Jan 25 23:53:29 2013 +0200 +++ b/Tools/buildbot/external-amd64.bat Fri Jan 25 22:52:26 2013 +0100 @@ -6,16 +6,16 @@ if not exist tcltk64\bin\tcl85g.dll ( cd tcl-8.5.11.0\win - nmake -f makefile.vc DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 clean all - nmake -f makefile.vc DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 install + nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 clean all + nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 install cd ..\.. ) if not exist tcltk64\bin\tk85g.dll ( cd tk-8.5.11.0\win - nmake -f makefile.vc OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.11.0 clean - nmake -f makefile.vc OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.11.0 all - nmake -f makefile.vc OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.11.0 install + nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.11.0 clean + nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.11.0 all + nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.11.0 install cd ..\.. ) diff -r d8c2ce63f5a4 -r 297b3529876a Tools/buildbot/external.bat --- a/Tools/buildbot/external.bat Fri Jan 25 23:53:29 2013 +0200 +++ b/Tools/buildbot/external.bat Fri Jan 25 22:52:26 2013 +0100 @@ -7,15 +7,15 @@ if not exist tcltk\bin\tcl85g.dll ( @rem all and install need to be separate invocations, otherwise nmakehlp is not found on install cd tcl-8.5.11.0\win - nmake -f makefile.vc DEBUG=1 INSTALLDIR=..\..\tcltk clean all + nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 DEBUG=1 INSTALLDIR=..\..\tcltk clean all nmake -f makefile.vc DEBUG=1 INSTALLDIR=..\..\tcltk install cd ..\.. ) if not exist tcltk\bin\tk85g.dll ( cd tk-8.5.11.0\win - nmake -f makefile.vc OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.11.0 clean - nmake -f makefile.vc OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.11.0 all - nmake -f makefile.vc OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.11.0 install + nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.11.0 clean + nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.11.0 all + nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.11.0 install cd ..\.. ) diff -r d8c2ce63f5a4 -r 297b3529876a Tools/scripts/h2py.py --- a/Tools/scripts/h2py.py Fri Jan 25 23:53:29 2013 +0200 +++ b/Tools/scripts/h2py.py Fri Jan 25 22:52:26 2013 +0100 @@ -50,11 +50,6 @@ searchdirs=os.environ['INCLUDE'].split(';') except KeyError: searchdirs=['/usr/include'] - try: - searchdirs.insert(0, os.path.join('/usr/include', - os.environ['MULTIARCH'])) - except KeyError: - pass def main(): global filedict diff -r d8c2ce63f5a4 -r 297b3529876a configure --- a/configure Fri Jan 25 23:53:29 2013 +0200 +++ b/configure Fri Jan 25 22:52:26 2013 +0100 @@ -1,11 +1,13 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for python 3.4. +# Generated by GNU Autoconf 2.68 for python 3.4. # # Report bugs to . # # -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. # # # This configure script is free software; the Free Software Foundation @@ -134,31 +136,6 @@ # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh @@ -192,8 +169,7 @@ else exitcode=1; echo positional parameters were not saved. fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" +test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && @@ -238,25 +214,21 @@ if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + # Preserve -v and -x to the replacement shell. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; + esac + exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : @@ -359,14 +331,6 @@ } # as_fn_mkdir_p - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take @@ -488,10 +452,6 @@ chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). @@ -526,16 +486,16 @@ # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. + # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' + as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @@ -547,8 +507,28 @@ as_mkdir_p=false fi -as_test_x='test -x' -as_executable_p=as_fn_executable_p +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -684,7 +664,6 @@ DLLLIBRARY LDLIBRARY LIBRARY -MULTIARCH BUILDEXEEXT EGREP GREP @@ -1271,6 +1250,8 @@ if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1560,9 +1541,9 @@ if $ac_init_version; then cat <<\_ACEOF python configure 3.4 -generated by GNU Autoconf 2.69 - -Copyright (C) 2012 Free Software Foundation, Inc. +generated by GNU Autoconf 2.68 + +Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1638,7 +1619,7 @@ test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || - test -x conftest$ac_exeext + $as_test_x conftest$ac_exeext }; then : ac_retval=0 else @@ -1936,8 +1917,7 @@ main () { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; -test_array [0] = 0; -return test_array [0]; +test_array [0] = 0 ; return 0; @@ -1991,8 +1971,7 @@ main () { static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; -test_array [0] = 0; -return test_array [0]; +test_array [0] = 0 ; return 0; @@ -2008,8 +1987,7 @@ { static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; -test_array [0] = 0; -return test_array [0]; +test_array [0] = 0 ; return 0; @@ -2059,8 +2037,7 @@ main () { static int test_array [1 - 2 * !(($2) >= 0)]; -test_array [0] = 0; -return test_array [0]; +test_array [0] = 0 ; return 0; @@ -2076,8 +2053,7 @@ main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0; -return test_array [0]; +test_array [0] = 0 ; return 0; @@ -2103,8 +2079,7 @@ main () { static int test_array [1 - 2 * !(($2) < 0)]; -test_array [0] = 0; -return test_array [0]; +test_array [0] = 0 ; return 0; @@ -2120,8 +2095,7 @@ main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; -test_array [0] = 0; -return test_array [0]; +test_array [0] = 0 ; return 0; @@ -2155,8 +2129,7 @@ main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0; -return test_array [0]; +test_array [0] = 0 ; return 0; @@ -2399,7 +2372,7 @@ running configure, to aid debugging if configure makes a mistake. It was created by python $as_me 3.4, which was -generated by GNU Autoconf 2.69. Invocation command line was +generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ @@ -2785,7 +2758,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_HAS_HG="found" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -2926,8 +2899,6 @@ - - if test "$cross_compiling" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for python interpreter for cross build" >&5 $as_echo_n "checking for python interpreter for cross build... " >&6; } @@ -2944,7 +2915,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $interp" >&5 $as_echo "$interp" >&6; } - PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(shell test -f pybuilddir.txt && echo $(abs_builddir)/`cat pybuilddir.txt`:)$(srcdir)/Lib:$(srcdir)/Lib/plat-$(MACHDEP) '$interp + PYTHON_FOR_BUILD="_PYTHON_PROJECT_BASE=$srcdir"' _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(srcdir)/Lib:$(srcdir)/Lib/plat-$(MACHDEP) '$interp fi elif test "$cross_compiling" = maybe; then as_fn_error $? "Cross compiling required --host=HOST-TUPLE and --build=ARCH" "$LINENO" 5 @@ -3251,9 +3222,9 @@ then # avoid using uname for cross builds if test "$cross_compiling" = yes; then - # ac_sys_system and ac_sys_release are used for setting - # a lot of different things including 'define_xopen_source' - # in the case statement below. + # ac_sys_system and ac_sys_release are only used for setting + # `define_xopen_source' in the case statement below. For the + # current supported cross builds, this macro is not adjusted. case "$host" in *-*-linux*) ac_sys_system=Linux @@ -3578,7 +3549,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3618,7 +3589,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3671,7 +3642,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3712,7 +3683,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue @@ -3770,7 +3741,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -3814,7 +3785,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4260,7 +4231,8 @@ /* end confdefs.h. */ #include #include -struct stat; +#include +#include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); @@ -4400,7 +4372,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CXX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4443,7 +4415,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_CXX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4498,7 +4470,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CXX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4541,7 +4513,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_CXX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4596,7 +4568,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CXX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4639,7 +4611,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_CXX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4702,7 +4674,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4746,7 +4718,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -4989,7 +4961,7 @@ for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in @@ -5055,7 +5027,7 @@ for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in @@ -5262,8 +5234,8 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -# define __EXTENSIONS__ 1 - $ac_includes_default +# define __EXTENSIONS__ 1 + $ac_includes_default int main () { @@ -5354,9 +5326,6 @@ esac;; esac -MULTIARCH=$($CC --print-multiarch 2>/dev/null) - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking LIBRARY" >&5 @@ -5662,7 +5631,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5702,7 +5671,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5757,7 +5726,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5801,7 +5770,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5865,7 +5834,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_READELF="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5909,7 +5878,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_READELF="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -5974,7 +5943,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PYTHON="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -6051,7 +6020,7 @@ # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. @@ -6120,7 +6089,7 @@ test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do - as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ @@ -6715,7 +6684,7 @@ # function available. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -pthread" >&5 $as_echo_n "checking whether $CC accepts -pthread... " >&6; } -if ${ac_cv_pthread+:} false; then : +if ${ac_cv_thread+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cc="$CC" @@ -8390,6 +8359,11 @@ + +cat >>confdefs.h <<_ACEOF +#define SHLIB_EXT "$SO" +_ACEOF + # LDSHARED is the ld *command* used to create shared library # -- "cc -G" on SunOS 5.x, "ld -shared" on IRIX 5 # (Shared libraries in this instance are shared modules to be loaded into @@ -9054,7 +9028,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -9097,7 +9071,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -10247,7 +10221,7 @@ sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \ - wcscoll wcsftime wcsxfrm writev _getpty + wcscoll wcsftime wcsxfrm writev _getpty dup3 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" @@ -10697,7 +10671,7 @@ IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_TRUE="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 @@ -12135,8 +12109,7 @@ main () { static int test_array [1 - 2 * !(((char) -1) < 0)]; -test_array [0] = 0; -return test_array [0]; +test_array [0] = 0 ; return 0; @@ -12167,11 +12140,11 @@ int main () { - +/* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus - /* Ultrix mips cc rejects this sort of thing. */ + /* Ultrix mips cc rejects this. */ typedef int charset[2]; - const charset cs = { 0, 0 }; + const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; @@ -12188,9 +12161,8 @@ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this sort of thing. */ - char tx; - char *t = &tx; + { /* SCO 3.2v4 cc rejects this. */ + char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; @@ -12206,10 +12178,10 @@ iptr p = 0; ++p; } - { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; } bx; - struct s *b = &bx; b->j = 5; + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; @@ -13722,12 +13694,6 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SO" >&5 $as_echo "$SO" >&6; } - -cat >>confdefs.h <<_ACEOF -#define SHLIB_EXT "$SO" -_ACEOF - - # Check whether right shifting a negative integer extends the sign bit # or fills with zeros (like the Cray J90, according to Tim Peters). { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether right shift extends the sign bit" >&5 @@ -15548,16 +15514,16 @@ # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. + # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' + as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @@ -15617,16 +15583,28 @@ as_mkdir_p=false fi - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" @@ -15648,7 +15626,7 @@ # values after options handling. ac_log=" This file was extended by python $as_me 3.4, which was -generated by GNU Autoconf 2.69. Invocation command line was +generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -15710,10 +15688,10 @@ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ python config.status 3.4 -configured by $0, generated by GNU Autoconf 2.69, +configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -15803,7 +15781,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' diff -r d8c2ce63f5a4 -r 297b3529876a configure.ac --- a/configure.ac Fri Jan 25 23:53:29 2013 +0200 +++ b/configure.ac Fri Jan 25 22:52:26 2013 +0100 @@ -50,8 +50,6 @@ AC_CONFIG_HEADER(pyconfig.h) AC_CANONICAL_HOST -AC_SUBST(build) -AC_SUBST(host) if test "$cross_compiling" = yes; then AC_MSG_CHECKING([for python interpreter for cross build]) @@ -67,7 +65,7 @@ AC_MSG_ERROR([python$PACKAGE_VERSION interpreter not found]) fi AC_MSG_RESULT($interp) - PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(shell test -f pybuilddir.txt && echo $(abs_builddir)/`cat pybuilddir.txt`:)$(srcdir)/Lib:$(srcdir)/Lib/plat-$(MACHDEP) '$interp + PYTHON_FOR_BUILD="_PYTHON_PROJECT_BASE=$srcdir"' _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(srcdir)/Lib:$(srcdir)/Lib/plat-$(MACHDEP) '$interp fi elif test "$cross_compiling" = maybe; then AC_MSG_ERROR([Cross compiling required --host=HOST-TUPLE and --build=ARCH]) @@ -354,9 +352,9 @@ then # avoid using uname for cross builds if test "$cross_compiling" = yes; then - # ac_sys_system and ac_sys_release are used for setting - # a lot of different things including 'define_xopen_source' - # in the case statement below. + # ac_sys_system and ac_sys_release are only used for setting + # `define_xopen_source' in the case statement below. For the + # current supported cross builds, this macro is not adjusted. case "$host" in *-*-linux*) ac_sys_system=Linux @@ -766,9 +764,6 @@ esac;; esac -MULTIARCH=$($CC --print-multiarch 2>/dev/null) -AC_SUBST(MULTIARCH) - AC_SUBST(LIBRARY) AC_MSG_CHECKING(LIBRARY) @@ -1441,7 +1436,7 @@ # so we need to run a program to see whether it really made the # function available. AC_MSG_CHECKING(whether $CC accepts -pthread) -AC_CACHE_VAL(ac_cv_pthread, +AC_CACHE_VAL(ac_cv_thread, [ac_save_cc="$CC" CC="$CC -pthread" AC_RUN_IFELSE([AC_LANG_SOURCE([[ @@ -1903,6 +1898,7 @@ AC_SUBST(CCSHARED) AC_SUBST(LINKFORSHARED) +AC_DEFINE_UNQUOTED(SHLIB_EXT, "$SO", [Define this to be extension of shared libraries (including the dot!).]) # LDSHARED is the ld *command* used to create shared library # -- "cc -G" on SunOS 5.x, "ld -shared" on IRIX 5 # (Shared libraries in this instance are shared modules to be loaded into @@ -2797,7 +2793,7 @@ sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy symlinkat sync \ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \ truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \ - wcscoll wcsftime wcsxfrm writev _getpty) + wcscoll wcsftime wcsxfrm writev _getpty dup3) AC_CHECK_DECL(dirfd, AC_DEFINE(HAVE_DIRFD, 1, @@ -3960,8 +3956,6 @@ fi AC_MSG_RESULT($SO) -AC_DEFINE_UNQUOTED(SHLIB_EXT, "$SO", [Define this to be extension of shared libraries (including the dot!).]) - # Check whether right shifting a negative integer extends the sign bit # or fills with zeros (like the Cray J90, according to Tim Peters). AC_MSG_CHECKING(whether right shift extends the sign bit) diff -r d8c2ce63f5a4 -r 297b3529876a pyconfig.h.in --- a/pyconfig.h.in Fri Jan 25 23:53:29 2013 +0200 +++ b/pyconfig.h.in Fri Jan 25 22:52:26 2013 +0100 @@ -193,6 +193,9 @@ /* Define to 1 if you have the `dup2' function. */ #undef HAVE_DUP2 +/* Define to 1 if you have the `dup3' function. */ +#undef HAVE_DUP3 + /* Defined when any dynamic module loading is enabled. */ #undef HAVE_DYNAMIC_LOADING diff -r d8c2ce63f5a4 -r 297b3529876a setup.py --- a/setup.py Fri Jan 25 23:53:29 2013 +0200 +++ b/setup.py Fri Jan 25 22:52:26 2013 +0100 @@ -2008,12 +2008,8 @@ # Increase warning level for gcc: if 'gcc' in cc: - cmd = ("echo '' | gcc -Wextra -Wno-missing-field-initializers -E - " - "> /dev/null 2>&1") - ret = os.system(cmd) - if ret >> 8 == 0: - extra_compile_args.extend(['-Wextra', - '-Wno-missing-field-initializers']) + extra_compile_args.extend(['-Wextra', + '-Wno-missing-field-initializers']) # Uncomment for extra functionality: #define_macros.append(('EXTRA_FUNCTIONALITY', 1))